C++ Erase vector element by value rather than by position?

ID : 10220

viewed : 32

Tags : c++vectorstleraseerase-remove-idiomc++

Top 5 Answer for C++ Erase vector element by value rather than by position?

vote vote

98

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.

vote vote

87

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); 
vote vote

71

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.

vote vote

67

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

vote vote

54

You can try the pipe functionality in sh.py:

import sh print sh.grep(sh.ps("-ax"), "process_name") 

Top 3 video Explaining C++ Erase vector element by value rather than by position?

Related QUESTION?