С++ стереть последний элемент вектора, используя стирание (итератор)

У меня есть этот код, который я составил, чтобы объяснить свою проблему:

#include <iostream>
#include <vector>

void
PrintVector (const std::vector<int> & vec)
{
  std::cout << "vector contains:";
  for (unsigned i = 0; i < vec.size (); ++i)
    std::cout << ' ' << vec[i];
  std::cout << '\n';
}

int
main ()
{
  std::vector<int> myvector;

  for (int i = 0; i <= 10; i++) myvector.push_back (i);
  PrintVector (myvector);

  int to_delete = 9;

  for (std::vector<int>::iterator it = myvector.begin (); it != myvector.end (); ++it)
    {
      if (*it == to_delete)
        {
          std::cout << *it << " found and deleted! \n";
          myvector.erase (it);
        }
    }
  PrintVector (myvector);

  to_delete = 10;

  for (std::vector<int>::iterator it = myvector.begin (); it != myvector.end (); ++it)
    {
      if (*it == to_delete)
        {
          std::cout << *it << " found and deleted! \n";
          myvector.erase (it);
        }
    }
  PrintVector (myvector);

  return 0;
}

У меня есть вектор, и мне нужно удалить некоторые элементы. Я не знаю их положения, поэтому мне приходится перебирать весь вектор, чтобы найти их. Я заметил, что если удаленный элемент является последней позицией, я получаю ошибку сегментации. Я не знаю почему.

Вывод, который я получаю:

vector contains: 0 1 2 3 4 5 6 7 8 9 10
9 found and deleted! 
vector contains: 0 1 2 3 4 5 6 7 8 10
10 found and deleted!         
10 found and deleted!       // QUESTION: This got repeated, why?

RUN FINISHED; Segmentation fault; core dumped; real time: 130ms; user: 0ms; system: 0ms

А должно быть примерно так:

vector contains: 0 1 2 3 4 5 6 7 8 9 10
9 found and deleted! 
vector contains: 0 1 2 3 4 5 6 7 8 10
10 found and deleted! 
vector contains: 0 1 2 3 4 5 6 7 8

RUN FINISHED; exit value 0; real time: 0ms; user: 0ms; system: 0ms

person Steve B.    schedule 22.04.2017    source источник
comment
Это довольно распространенная проблема с C++ и итераторами… будьте осторожны, вы можете получить недопустимый итератор.   -  person Dietrich Epp    schedule 22.04.2017
comment
Если вы удалите последний элемент, итератор теперь будет указывать на vector.end()… поэтому, если вы затем ++ итератор, вы прошли прошлое конец и получите проблемы.   -  person Dietrich Epp    schedule 22.04.2017