考虑下面的程序,它向一个向量中插入一系列元素:
vector<string> v1;
vector<string> v2;
v1.push_back("one");
v1.push_back("two");
v1.push_back("three");
v2.push_back("four");
v2.push_back("five");
v2.push_back("six");
v1.insert(v1.end(), v2.begin(), v2.end());
这段代码高效地复制了一个范围,为目标向量分配足够的空间以容纳整个范围,因此最多只需要一个调整大小的操作。现在考虑以下尝试将范围移动到向量中的程序:
vector<string> v1;
vector<string> v2;
v1.push_back("one");
v1.push_back("two");
v1.push_back("three");
v2.push_back("four");
v2.push_back("five");
v2.push_back("six");
for_each ( v2.begin(), v2.end(), [&v1]( string & s )
{
v1.emplace_back(std::move(s));
});
这个操作可以成功移动数据,但是并没有像insert()一样预分配目标向量的空间,所以在操作期间向量可能会被多次调整大小。
因此我的问题是,是否有一个与insert()等效的函数可以将一个范围移动到向量中?
std::vector::reserve
,并保持push_back
/emplace_back
。 - rubenvbinsert()
一样干净的方法。 - Benjstd::vector
时,这总是成立的,不是吗? - Benjstd::vector
迭代器是随机访问的,但库可能不包括优化。而且问题似乎是关于从任意未指定范围插入到向量中,这可能没有随机访问迭代器。 - Ben Voigt