У меня есть этот код, который я составил, чтобы объяснить свою проблему:
#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
vector.end()
… поэтому, если вы затем++
итератор, вы прошли прошлое конец и получите проблемы. - person Dietrich Epp   schedule 22.04.2017