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


This question already has an answer here:


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

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;


2 4 6 8 10 ----- 2 4 6 10

Need Your Help

Store a value in ViewBag from javascript

javascript asp.net-mvc-3 viewbag

How can I store a value in the ViewBag accessing it from javascript?

Why does Math.round(0.49999999999999994) return 1?

java floating-point double rounding

In the following program you can see that each value slightly less than .5 is rounded down, except for 0.5.