我想复制矢量的内容,并希望它们附加在原始矢量的末尾,即v[i]=v[i+n] for i=0,2,...,n-1
我正在寻找一种很好的方法,而不是循环。我看到std::vector::insert
,但迭代版本禁止迭代器到*this
(即行为未定义)。
我还尝试std::copy
如下(但导致分段错误):
copy( xx.begin(), xx.end(), xx.end());
答案 0 :(得分:28)
哇。如此多的答案都很接近,没有一个正确的答案。您需要同时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
是必需的,因为end()
迭代器将一个元素指向结尾...这意味着它也不是第一个的“插入点之前”插入,变得无效。
23.3.6.5 [vector.modifiers]
承诺insert
和push_back
:
备注:如果新大小大于旧容量,则会导致重新分配。 如果没有重新分配,插入点之前的所有迭代器和引用都保持有效。如果除了复制构造函数之外抛出异常,则移动构造函数,赋值运算符或移动赋值运算符T或by任何InputIterator操作都没有效果。如果非CopyInsertable T的移动构造函数抛出异常,则未指定效果。
答案 1 :(得分:3)
我会这样做:
#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;
}
答案 2 :(得分: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
答案 3 :(得分:0)
这可能不是最有效的方式,但肯定很简单:
std::vector<int> toAppend(xx);
xx.insert(xx.end(), toAppend.begin(), toAppend.end();