Iterator and Algorithm Patterns
Remove Erase
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.