How do I remove an item from a stl vector with a certain value?

c++ vector remove element by value
delete element from vector c++ stl
std vector remove object at index
removing vector element by index
how to delete all elements from a vector
remove element in vector using index
delete nth element from vector c++
std vector erase element by value

I was looking at the API documentation for stl vector, and noticed there was no method on the vector class that allowed the removal of an element with a certain value. This seems like a common operation, and it seems odd that there's no built in way to do this.

std::remove does not actually erase the element from the container, but it does return the new end iterator which can be passed to container_type::erase to do the REAL removal of the extra elements that are now at the end of the container:

std::vector<int> vec;
// .. put in some values ..
int int_to_remove = n;
vec.erase(std::remove(vec.begin(), vec.end(), int_to_remove), vec.end());

vector::erase - C++ Reference, How do I remove a specific element from a vector in C++? c++ - index - How do I remove an item from a stl vector with a certain value? vector remove first element (6) I was looking at the API documentation for stl vector, and noticed there was no method on the vector class that allowed the removal of an element with a certain value.

If you want to remove an item, the following will be a bit more efficient.

std::vector<int> v;


auto it = std::find(v.begin(), v.end(), 5);
if(it != v.end())
    v.erase(it);

or you may avoid overhead of moving the items if the order does not matter to you:

std::vector<int> v;

auto it = std::find(v.begin(), v.end(), 5);

if (it != v.end()) {
  using std::swap;

  // swap the one to be removed with the last element
  // and remove the item at the end of the container
  // to prevent moving all items after '5' by one
  swap(*it, v.back());
  v.pop_back();
}

Does vector::erase() on a vector of object pointers destroy the object , How do you remove the first element of a vector in C++? Your 2nd answer .. I wouldn't do it this way. To extend to delete ALL occurrences of VALUE would trip people up in 2 possible places: iter is invalidated after .erase(), and ++iter would fail immediately. Would have to write iter=v.erase(iter); instead. Now if you do it that way, an extra ++iter will

Use the global method std::remove with the begin and end iterator, and then use std::vector.erase to actually remove the elements.

Documentation links std::remove http://www.cppreference.com/cppalgorithm/remove.html std::vector.erase http://www.cppreference.com/cppvector/erase.html

std::vector<int> v;
v.push_back(1);
v.push_back(2);

//Vector should contain the elements 1, 2

//Find new end iterator
std::vector<int>::iterator newEnd = std::remove(v.begin(), v.end(), 1);

//Erase the "removed" elements.
v.erase(newEnd, v.end());

//Vector should now only contain 2

Thanks to Jim Buck for pointing out my error.

How to remove an item from a C++ STL vector with a certain value?, anything pointed to by a pointer. You should use automatic life-time managing pointers such as shared_ptr to manage object lifetimes. Using std::list::remove_if to remove elements from a List based on Criterion. In previous example we deleted all the elements from a List that matched the passed values. But this might not be the requirement every time. Many times we need to delete certain elements from a list based on certain criterion Like,

The other answers cover how to do this well, but I thought I'd also point out that it's not really odd that this isn't in the vector API: it's inefficient, linear search through the vector for the value, followed by a bunch of copying to remove it.

If you're doing this operation intensively, it can be worth considering std::set instead for this reason.

Different ways to remove elements from vector in C++ STL, Erase function is used to remove an item from a C++ STL vector with a certain value.AlgorithmBegin Declare vector v and iterator it to the vector  Student ID is a string because I do not plan to do any arithmetic on it – liphoto liphoto Jul 27 '16 at 14:42 But if it is a unique number, making it a numeric datatype still has some advantages, such as the fact that you can quickly compare it to other IDs and can safely use it as keys into an std::map .

If you have an unsorted vector, then you can simply swap with the last vector element then resize().

With an ordered container, you'll be best off with ‍std::vector::erase(). Note that there is a std::remove() defined in <algorithm>, but that doesn't actually do the erasing. (Read the documentation carefully).

Difference between std::remove and vector::erase for vectors , Removes from the vector either a single element (position) or a range of std::​vector< int > myvector; // set some values (from 1 to 10) for ( int i=1; i<=10; i++)  If you need to remove multiple elements from the vector, the std::remove will copy each, not removed element only once to its final location, while the vector::erase approach would move all of the elements from the position to the end multiple times. For Example, Consider removing all elements < 5 in following vector.

vector erase() and clear() in C++, Parameters: Position of the element or range of elements to be removed. Result: Elements are removed from the position specified. Time Complexity: O(N) - worst​  Removes from the vector either a single element (position) or a range of elements ([first,last)). This effectively reduces the container size by the number of elements removed, which are destroyed. Because vectors use an array as their underlying storage, erasing elements in positions other than the vector end causes the container to relocate all the elements after the segment erased to their new positions.

How to Remove Elements from a Sequence Container in C++ , How to use make utility to build C projects?` Queries for elements having values within the range A to B in the given index range using Segment Tree · C/C++ #  clear() removes all the elements from a vector container, thus making its size 0. All the elements of the vector are removed using clear() function. erase() function on the other hand, is used to remove specific elements from the container or a range of elements from the container, thus reducing its size by the number of elements removed.

remove value from vector c++ Code Example, clear() function is used to remove all the elements of the vector container, thus of the element to be removed in the form of iterator. or the range specified using  The idea is to use iterators to iterate the vector and call the vector::erase function if current element matches the predicate. Since calling the erase() method on the vector element invalidates the iterator, special care needs to be taken while erasing an element.

Comments
  • I know I've mentioned this several times before but Scott Meyer's book Effective STL covers these gotchas in a clear way.
  • Related: stackoverflow.com/questions/3385229/…
  • This might be an interesting reading to you: en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom
  • Does this all-in-one-statement form depend on the order in which the compiler evaluates the arguments, or is vec.end() guaranteed to be the same on either side of the call to std::remove? It looks to me in reading other parts of the web like this is safe, but it should be stated clearly.
  • It's fine. The result of vec.end() doesn't need to be the same; it just needs to be correct (which it is).
  • vec.end() does need to be the same, but that's OK because std::remove doesn't change it. If it did change it (and invalidate the old value) then there would be a problem: order of evaluation of parameters is unspecified and therefore you wouldn't know whether the second vec.end() is still valid by the time it's used. The reason it's the same is simple, std::remove doesn't change the size of the container, it just moves the contents around.
  • I've found this question important, since I have the same problem. But, my visual studio takes std::remove with only one argument; that is const char *_Filename. What method do I need to call?
  • That is the version of remove that deletes a file. You need to include <algorithm> in order to access the version of remove that deals with containers.
  • Note this will not remove duplicates of the item if they exist, whereas the std::remove_if approach does.
  • This has the ability to prevent movement of other elements on erasure of an element in the middle of the vector therefore this is faster. It moves them to the end of the vector first then you can just discard from the end of the vector.
  • Please add more detail to this post. As it stands, a majority of its content comes from a link, and would be lost if the link ever breaks.
  • what about the fact bind2nd is -(deprecated in C++11) (removed in C++17)
  • Not only that, it's overloaded for each specific container!