Хороший способ добавить вектор к себе

Я хочу дублировать содержимое вектора и хочу, чтобы они были добавлены в конце исходного вектора, т. v[i]=v[i+n] for i=0,2,...,n-1

Я ищу хороший способ сделать это, а не с циклом. Я видел std::vector::insert но итеративная версия запрещает iteratorу to *this (т.е. поведение не определено).

Я также попробовал std::copy следующим образом (но это привело к ошибке сегментации):

copy( xx.begin(), xx.end(), xx.end());

Вау. Так много ответов, которые близки, ни одного со всеми правильными деталями. Вам необходимо resize (или reserve ) и copy_n , а также запомнить первоначальный размер.

 auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() + old_count); 

или

 auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx)); 

При использовании reserve требуется copy_n потому что iterator end() указывает один элемент за конец … что означает, что он также не «до точки вставки» первой вставки и становится недействительным.


23.3.6.5 [vector.modifiers] обещает, что для insert и push_back :

Замечания: вызывает перераспределение, если новый размер больше старой. Если перераспределение не происходит, все iteratorы и ссылки до точки вставки остаются в силе. Если исключение выбрано иначе, чем конструктор копирования, переместите конструктор, оператор присваивания или оператор присваивания перемещения T или любую операцию InputIterator, никаких эффектов нет. Если исключение выбрасывается конструктором перемещения не-CopyInsertable T, то они не заданы.

Я бы сделал это так:

 #include  #include  #include  int main(int argc, char* argv[]) { std::vector v1 = { 1, 2, 3, 4, 5 }; { std::vector v2(v1.begin(), v1.end()); std::copy(v1.begin(), v1.end(), std::back_inserter(v2)); std::swap(v1, v2); } return 0; } 

EDIT: Я добавил немного более эффективную версию.

 #include  #include  #include  int main(int argc, char* argv[]) { std::vector v1 = { 1, 2, 3, 4, 5 }; { typedef std::move_iterator VecMoveIter; std::vector v2(v1); std::copy(VecMoveIter(v1.begin()), VecMoveIter(v1.end()), std::back_inserter(v2)); v1 = std::move(v2); } return 0; } 

Для добавления нескольких слотов дубликатов.

  int main() { std::vector V; V.push_back(1); V.push_back(2); int oldSize = V.size(); int newSize = oldSize; int nDupSlot = 4; V.resize(nDupSlot * oldSize); for(int i=0; i<(nDupSlot-1); ++i) { std::copy_n(V.begin(), oldSize, V.begin() + newSize); newSize = newSize + oldSize; } for(int i =0; i 

Вывод:

 12121212 

Это может быть не самый эффективный способ, но он прост:

 std::vector toAppend(xx); xx.insert(xx.end(), toAppend.begin(), toAppend.end(); 
  • Могу ли я использовать константу в векторах, чтобы добавлять элементы, но не изменять уже добавленные?
  • Стирание элементов из вектора
  • Удаление элементов из STL, установленных во время итерации
  • Защита streamов std :: map для операций только для чтения
  • Выполнение qsort vs std :: sort?
  • Многомерный std :: array
  • Почему нет оператора для std :: list?
  • В чем разница между const_iterator и non-const iterator в C ++ STL?
  • Какие недостатки C ++ следует избегать?
  • сортировка проблем с использованием функции-члена в качестве компаратора
  • Как отсортировать вектор пар на основе второго элемента пары?
  • Давайте будем гением компьютера.