Отвечать Как скопировать вектор? меня немного смутил об аннулировании итератора. В какой-то литературе говорится: "Если вы используете insert, 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);
Эта цитата из "Справочной библиотеки стандартной библиотеки С++" от Josuttis:
Вставка или удаление элементов аннулирует ссылки, указатели и итераторы, которые ссылаются на следующие элемент. Если вставка вызывает перераспределения, он аннулирует все ссылки, итераторы и указатели.
предлагает, чтобы мой код был безопасным и определял поведение. Есть ли проход в стандарте, который гарантирует это?