итератор становится недействительным после замены временным контейнером - PullRequest
1 голос
/ 10 августа 2011

Говорят, что если поменять значение двух контейнеров, итератор не станет недействительным.

, поэтому следующий код работает нормально

vector<int> v1;
v1.push_back(1);
vector<int>::iterator i = v1.begin();

vector<int> v2(v1);
v2.swap(v1);
cout<<*i<<endl;  //output 1

но когда я обратился к временному контейнеру, итератор стал недействительным, и программа потерпела крах.

vector<int> v1;
v1.push_back(1);
vector<int>::iterator i = v1.begin();

vector<int>(v1).swap(v1);
cout<<*i<<endl;  //i become invalid and program crashes here

Это может быть глупый вопрос, но я не могу понять, что не так.

Ответы [ 4 ]

3 голосов
/ 10 августа 2011

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

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

2 голосов
/ 10 августа 2011

Итератор здесь - это не просто указатель на элемент в массиве.

В обоих случаях вы меняете внутренний массив в векторах. В первом случае итератор теперь указывает на массив, принадлежащий второму вектору. Во втором случае итератор указывает на массив, принадлежащий и уже освобожденный временным вектором.

1 голос
/ 10 августа 2011

Поскольку область действия следующего временного остается только до конца инструкции (;)

vector<int>(v1).swap(v1);

Теперь v1 содержит свою копию, которая уничтожается в точке с запятой.Таким образом, итератор i указывает на недопустимый итератор после этого ;.

0 голосов
/ 10 августа 2011

Ваш второй отрывок кода создает копию v1, а затем заменяется v1. Это разрушает вектор v1, и это делает недействительным итератор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...