The erase-remove pattern compacts unwanted values and then trims the container to the new logical end.

Remove Erase

remove_erase.cpp
#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> levels{3, 7, 2, 9, 5};
    int keepAtLeast = ;

    auto newEnd = std::remove_if(levels.begin(), levels.end(),
        [keepAtLeast](int level) {
            return level < keepAtLeast;
        });
    levels.erase(newEnd, levels.end());

    std::cout << "keepAtLeast=" << keepAtLeast << std::endl;
    std::cout << "kept=" << levels.size() << std::endl;
    std::cout << "first=" << levels.front() << std::endl;
    return 0;
}
#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> levels{3, 7, 2, 9, 5};
    int keepAtLeast = ;

    auto newEnd = std::remove_if(levels.begin(), levels.end(),
        [keepAtLeast](int level) {
            return level < keepAtLeast;
        });
    levels.erase(newEnd, levels.end());

    std::cout << "keepAtLeast=" << keepAtLeast << std::endl;
    std::cout << "kept=" << levels.size() << std::endl;
    std::cout << "first=" << levels.front() << std::endl;
    return 0;
}
#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> levels{3, 7, 2, 9, 5};
    int keepAtLeast = ;

    auto newEnd = std::remove_if(levels.begin(), levels.end(),
        [keepAtLeast](int level) {
            return level < keepAtLeast;
        });
    levels.erase(newEnd, levels.end());

    std::cout << "keepAtLeast=" << keepAtLeast << std::endl;
    std::cout << "kept=" << levels.size() << std::endl;
    std::cout << "first=" << levels.front() << std::endl;
    return 0;
}
remove_if `std::remove_if` moves kept values forward and returns the new logical end.
erase `erase` removes the leftover tail after `remove_if` has compacted the kept values.