Количество допустимых активных итераторов в векторе - PullRequest
0 голосов
/ 07 августа 2010

Например, допустимо ли следующее:

std::vector<int> vec(5, 0);
std::vector<int>::const_iterator it1(vec.begin());
std::vector<int>::const_iterator it2(vec.begin());
//Use it1 and it2 like they don't know about each other.

Существует ли специальное имя для контейнера, разрешающего несколько активных итераторов?

Ответы [ 3 ]

1 голос
/ 07 августа 2010

Да, это действительно.

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

Специальное имя для этого типа контейнера - «любой контейнер STL». Все контейнеры позволяют это.

Может быть, объяснить, почему вы думаете, что это не должно быть разрешено?

0 голосов
/ 07 августа 2010

Это определенно допустимо. То, о чем вы должны беспокоиться, это если вы начнете стирать или вставлять элементы. Разные контейнеры имеют разное поведение для аннулирования итераторов путем изменения функций, вам придется взглянуть на документацию. Например, erase в vector делает недействительными все итераторы и ссылки на элементы после удаляемого элемента.

0 голосов
/ 07 августа 2010

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

Обратите внимание, что использование функций контейнера для вставки / удаления элементов ТАКЖЕ сделает итераторы недействительными.

Основная проблема заключается в том, что контейнеры STL ничего не знают об активных итераторах, поэтому они не могут сказать итераторам, что что-то изменилось.

...