This question already has answers here: How do I remove an item from a stl vector with a certain value? (12 answers) Closed 6 years ago.
vector<int> myVector;
and lets say the values in the vector are this (in this order):
5 9 2 8 0 7
If I wanted to erase the element that contains the value of "8", I think I would do this:
myVector.erase(myVector.begin()+4);
Because that would erase the 4th element. But is there any way to erase an element based off of the value "8"? Like:
myVector.eraseElementWhoseValueIs(8);
Or do I simply just need to iterate through all the vector elements and test their values?
assert()
)", "log a message to std::cerr
"... and even those aren't exhaustive. No, the asker of the question needs to state the error handling policy, and whether finding no matches even is an error.
How about std::remove()
instead:
#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
This combination is also known as the erase-remove idiom.
You can use std::find
to get an iterator to a value:
#include <algorithm>
std::vector<int>::iterator position = std::find(myVector.begin(), myVector.end(), 8);
if (position != myVector.end()) // == myVector.end() means the element was not found
myVector.erase(position);
position = myVector.begin()
and enclose everything in a while(position != myVector.end())
loop
Error C2676 binary '==': 'action' does not define this operator or a conversion to a type acceptable to the predefined operator
in xutility
. Literally any method I come across for this example gives me this error.
You can not do that directly. You need to use std::remove
algorithm to move the element to be erased to the end of the vector and then use erase
function. Something like: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());
. See this erasing elements from vector for more details.
Eric Niebler is working on a range-proposal and some of the examples show how to remove certain elements. Removing 8. Does create a new vector.
#include <iostream>
#include <range/v3/all.hpp>
int main(int argc, char const *argv[])
{
std::vector<int> vi{2,4,6,8,10};
for (auto& i : vi) {
std::cout << i << std::endl;
}
std::cout << "-----" << std::endl;
std::vector<int> vim = vi | ranges::view::remove_if([](int i){return i == 8;});
for (auto& i : vim) {
std::cout << i << std::endl;
}
return 0;
}
outputs
2 4 6 8 10 ----- 2 4 6 10
Success story sharing
remove()
: It moves all values not equal to the value passed to the beginning of the range[begin,end)
. With your example in the question you'd get5,9,2,0,7,7
. Asremove()
however returns an iterator to the new end,vec.erase()
can remove the obsolete elements (i.e. the second7
here) if that is needed.