【发布时间】:2016-06-07 00:25:54
【问题描述】:
考虑以下将一系列元素插入向量的程序:
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() 在目标向量中预分配空间方面的好处,因此在操作期间可以多次调整向量的大小。
所以我的问题是,是否有插入等效项可以将范围移动到向量中?
【问题讨论】:
-
如果需要在vector中预分配空间,使用
std::vector::reserve,保留push_back/emplace_back。 -
这将是一个可选优化,仅当范围由随机访问迭代器定义时才有可能。不要指望它。
-
@rubenvb 是的,我认为这可能就是答案,可惜没有像
insert()这样干净的方法。 -
虽然在使用
std::vector时总是如此? -
@Benj:
std::vector迭代器是随机访问的,但库可能不包含优化。这个问题似乎是在询问从任意未指定范围插入向量,该范围可能没有随机访问迭代器。
标签: c++ c++11 insert stdvector