将矢量附加到自身的好方法

Ama*_*tam 21 c++ stl stdvector c++11

我想复制矢量的内容,并希望它们被附加在原始矢量的末尾,即 v[i]=v[i+n] for i=0,2,...,n-1

我正在寻找一种很好的方法,而不是循环.我看到std::vector::insert但迭代版本禁止迭代器*this(即行为未定义).

我也尝试std::copy如下(但它导致分段错误):

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

Ben*_*igt 31

哇.如此多的答案都很接近,没有一个正确的答案.你需要两个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);
Run Code Online (Sandbox Code Playgroud)

要么

auto old_count = xx.size();
xx.reserve(2 * old_count);
std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
Run Code Online (Sandbox Code Playgroud)

使用时reserve,copy_n是必需的,因为end()迭代器指向一个元素超过结尾...这意味着它也不是第一次插入的"插入点之前",并且变为无效.


23.3.6.5 [vector.modifiers]承诺,为insertpush_back:

备注:如果新大小大于旧容量,则会导致重新分配.如果没有重新分配,插入点之前的所有迭代器和引用仍然有效.如果除了复制构造函数之外抛出异常,移动构造函数,赋值运算符或T的移动赋值运算符,或者通过任何InputIterator操作都没有效果.如果非CopyInsertable T的移动构造函数抛出异常,则指定的效果未指定.

  • 对于下一个问题,正如我所做的那样:除了不同的迭代器之外,在第一个示例中使用了“vector::resize”,而在示例中使用了“vector::reserve”。 (2认同)