Take the 2-minute tour ×

Does it works correct(does nothing) when I use

 vector<T> v;

I want to use something like


Should I if is it v.end() or not?
There is no info about it on C++.com and CPPreference

share|improve this question
add comment

4 Answers

up vote 11 down vote accepted

Erasing end() (or for that matter, even looking at the target of end()) is undefined behavior. Undefined behavior is allowed to have any behavior, including "just work" on your platform. That doesn't mean that you should be doing it; it's still undefined behavior, and I'll come bite you in the worst ways when you're least expecting it later on.

Depending on what you're doing, you might want to consider set or unordered_set instead of vector here.

share|improve this answer
thanks, i do know what is UB, I just was wanted to know, is it really UB. –  RiaD Mar 6 '12 at 19:12
@RiaD: Yes, it is UB. The solution is very simple, though, just check before you erase: { auto it = v.find(x); if (it != x.end()) { v.erase(it); } } –  Kerrek SB Mar 6 '12 at 19:13
Question for you @Billy. Out of curiosity, does end()-1 work? How is this different from pop_back()? –  Gaffi Mar 6 '12 at 19:13
@Gaffi: end-1 will work if and only if the container is not empty. (Same as pop_back) –  Billy ONeal Mar 6 '12 at 19:14
@KerrekSB, yes I know I can check, it's quite easy:D. It just some ugly and I was thinking about replacing it:) –  RiaD Mar 6 '12 at 19:15
show 2 more comments

The standard doesn't quite spell it out, but v.erase(q) is defined, "Erases the element pointed to by q" in [sequence.reqmts]. This means that q must actually point to an element, which the end iterator doesn't. Passing in the end iterator is UB.

Unfortunately, you need to write:

auto it = std::find(...);
if (it != <the part of ... that specifies the end of the range searched>) {

Of course, you could define:

template typename<Sequence, Iterator>
Iterator my_erase(Sequence &s, Iterator it) {
    if (it == s.end()) return it;
    return s.erase(it);

my_erase(v, std::find(v.begin(), v.end(), whatever));

c.erase() on an associative container returns void, so to generalize this template to all containers you need some -> decltype action.

share|improve this answer
+1 for standardese reference. –  Billy ONeal Mar 6 '12 at 19:13
docs says that " erasing elements in positions other than the vector end causes the container to relocate...". It looks like alowing of end() as parameter. And nowhere said the opposite explicitly. I dont like this... –  Pavel Jan 8 at 18:13
@Pavel: then you'll have to take it up with the authors of "cplusplus.com". It is not the C++ documentation, the standard is the C++ documentation. But it defines position as "Iterator pointing to a single element". An end iterator does not point to a single element. –  Steve Jessop Jan 9 at 10:47
add comment

Have you tried this?

v.erase(remove_if(v.begin(), v.end(), (<your criteria>)), v.end());
share|improve this answer
-1: Algorithms do not remove elements from containers. –  Billy ONeal Mar 6 '12 at 19:05
Lack of other correct answers does not make your answer correct. –  Billy ONeal Mar 6 '12 at 19:07
I don't know why this has been downvoted (other than maybe an initial answer that has been edited). The code as it stands is correct. –  David Rodríguez - dribeas Mar 6 '12 at 19:08
@DavidRodríguez-dribeas: As originally posted, it was not correct. Now that it has been edited to be correct, I have removed my downvote. –  Billy ONeal Mar 6 '12 at 19:08
i needn't remove_if, I guess –  RiaD Mar 6 '12 at 19:09
show 3 more comments

You can use the pop_back function to erase the last element of the vector.

Instead of v.erase(v.end()); try v.pop_back();

Further informations in: http://www.cplusplus.com/reference/vector/vector/pop_back/

share|improve this answer
It doesn't answer the question. –  RiaD Jun 5 '13 at 12:06
add comment

Your Answer


