很好的方式来追加向量自己

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

我正在寻找一个很好的方式来做到这一点,而不是一个循环。 我看到std::vector::insert但迭代版本禁止迭代器*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)); 

当使用reservecopy_n是必需的,因为end()迭代器指向一个元素超过结尾…这意味着它也不是在第一个插入的“插入点之前”,并且变得无效。


23.3.6.5 [vector.modifiers]承诺insertpush_back

备注:如果新大小大于旧容量,将导致重新分配。 如果没有重新分配,插入点之前的所有迭代器和引用保持有效。 如果抛出除复制构造函数以外的exception,则移动构造函数,赋值运算符或移动T的赋值运算符或任何InputIterator操作都不会产生任何效果。 如果exception是由非CopyInsertable T的移动构造函数引发的,则这些影响是未指定的。

我会这样做:

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

编辑:我添加了一个更有效的版本。

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

用于附加多个重复的插槽。

  int main() { std::vector<int> 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<V.size(); ++i) { std::cout<<V[i]; } return 0; } 

输出:

 12121212 

这可能不是最有效的方法,但确实很简单:

 std::vector<int> toAppend(xx); xx.insert(xx.end(), toAppend.begin(), toAppend.end();