c++ - 是否有将范围移动到 vector 中的标准方法?

标签 c++ c++11 insert stdvector

考虑以下将一系列元素插入 vector 的程序:

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 中为整个范围分配了足够的空间,因此最多需要一次调整大小。现在考虑以下试图将范围移动到 vector 中的程序:

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 中预分配空间方面的好处,因此在操作期间可以多次调整 vector 的大小。

所以我的问题是,是否有一个插入等效项可以将范围移动到 vector 中?

最佳答案

您将 move_iteratorinsert 一起使用:

v1.insert(v1.end(), make_move_iterator(v2.begin()), make_move_iterator(v2.end()));

24.5.3 中的例子几乎就是这样。

如果 (a) vector::insert 使用迭代器标签调度来检测随机访问迭代器并预先计算大小(您假设它确实如此),您将获得所需的优化在您复制的示例中),并且(b) move_iterator 保留它包装的迭代器的迭代器类别(这是标准要求的)。

在一个晦涩的点上:我很确定 vector::insert 可以从源中放置(这里无关紧要,因为源与目标的类型相同,所以放置与复制/移动相同,但与其他相同的示例相关)。我还没有找到需要这样做的声明,我只是从迭代器对 i,j 的要求传递给 insertTEmplaceConstructible from *i.

关于c++ - 是否有将范围移动到 vector 中的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720122/

相关文章:

c++ - 如何为双向链表创建交换函数?

c++ - 将 std::stable_partition 和::iterator 与 vector 一起使用

c++ - "return-by-reference"或 "pass-by-reference"参数何时与 constexpr 兼容?

php - 关于重复键更新所有新数据 PHP MySQL

c++ - 绘制波形 - 转换为 DB 压缩它

c++ - 自解压可执行 C++

c++ - 右值引用——我失去了值(value)

c++ - 创建库以覆盖迭代器的 operator*() - 风险悬空指针

c++ - 尝试只插入单词的第一个字母,而不是整个单词

php - 上传图片并在 codeigniter 中插入文本