Ответ на Как самостоятельно скопировать вектор? меня немного смутил об инвалидации итератора. В некоторой литературе говорится: «Если вы используете вставку, push_back и т. д., считайте все итераторы недействительными». Это ясно, это может привести к увеличению вектора, что сделает итераторы недействительными. Как насчет особого случая, когда я знаю, что места будет достаточно?
первая попытка:
myvec.reserve(myvec.size()*3); //does this protect me from iterator invalidation?
vector<string>::iterator it = myvec.end();
myvec.insert(myvec.end(), myvec.begin(), it);
myvec.insert(myvec.end(), myvec.begin(), it);
После нескольких отличных ответов вторая попытка:
auto size = myvec.size();
myvec.reserve(size*3); //does this protect me from iterator invalidation?
myvec.insert(myvec.end(), myvec.begin(), myvec.begin()+size);
myvec.insert(myvec.end(), myvec.begin(), myvec.begin()+size);
После более отличных ответов третья попытка:
auto size = myvec.size();
myvec.reserve(size*3); //does this protect me from iterator invalidation?
back_insert_iterator< vector<string> > back_it (myvec);
copy (myvec.begin(),myvec.begin()+size,back_it);
copy (myvec.begin(),myvec.begin()+size,back_it);
Эта цитата из "Справочника по стандартной библиотеке С++" Джосуттиса:
Вставка или удаление элементов делает недействительными ссылки, указатели и итераторы, которые относятся к следующему элементу. Если вставка вызывает перераспределение, она делает недействительными все ссылки, итераторы и указатели.
предполагает, что мой код безопасен и имеет определенное поведение. Есть ли в стандарте пункт, который это гарантирует?
std::vector<T>::insert()
: Вызывает перераспределение, если новый size() больше, чем старый capacity(). Если новый size() больше, чем capacity(), все итераторы и ссылки становятся недействительными. . В противном случае аннулируются только итераторы и ссылки после добавленного элемента. Я бы проконсультировался со стандартом, но, в отличие от других сайтов, cppreference поддерживается участниками, которые живут, дышат и умирают согласно стандарту. - person WhozCraig   schedule 12.02.2013