As the title says I want to remove/merge objects in a vector which fulfill specific conditions. I mean I know how to remove integers from a vector which have the value 99 for instance.
The remove idiom by Scott Meyers:
vector<int> v; v.erase(remove(v.begin(), v.end(), 99), v.end());
But suppose if have a vector of objects which contains a delay member variable. And now I want to eliminate all objects which delays differs only less than a specific threshold and want to combine/merge them to one object.
The result of the process should be a vector of objects where the difference of all delays should be at least the specified threshold.
vector::erase() erase() function is used to remove elements from a container from the specified position or range.
The C++ vector has many member functions. Two of these member functions are erase() and pop_back(). pop_back() removes the last element from the vector. In order to remove all the elements from the vector, using pop_back(), the pop_back() function has to be repeated the number of times there are elements.
The removeAll() method of Java Vector class deletes all the elements from the vector that are present in the specified collection.
The idea is to swap the last element and an element you want to remove and then pop_back() . If you need to remove the last elemtent - just pop_back() . The order of the vector will not be the same but you get a fast remove method.
std::remove_if
comes to the rescue!
99 would be replaced by UnaryPredicate
that would filter your delays, which I am going to use a lambda function for.
And here's the example:
v.erase(std::remove_if( v.begin(), v.end(), [](const int& x) { return x > 10; // put your condition here }), v.end());
C++20 introduces std::erase_if
for the very purpose of the objective in this question.
It simplifies the erase-remove idiom for std::vector
, and is implemented for other standard containers, including std::string
.
Given the example in the current accepted answer:
v.erase(std::remove_if( v.begin(), v.end(), [](const int& x) { return x > 10; // put your condition here }), v.end());
You can now make the same logic more readable as:
std::erase_if( v, [](const int& x){return x > 10;} ); // container ^ ^ predicate
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With