【问题标题】:How to move one vector into another vector without copying如何在不复制的情况下将一个向量移动到另一个向量
【发布时间】:2020-10-13 20:31:15
【问题描述】:

我在一个范围内创建了一个大的vector<object>,我想将它推入驻留在该范围之外的向量而不复制它(因为它非常大)。有没有一种方法可以将向量 v 推入 vvec 而无需像我目前所做的那样进行复制?

std:vector<std::vector<object>> vvec;
{
    std::vector<object> v;
    v.emplace_back(object());
    vvec.push_back(v);
}

【问题讨论】:

  • 或者,您可以vvec.emplace_back() 一个新的空向量,然后使用vvec.back().emplace_back(object()); 添加到它。它节省了一步,但从异常安全的角度来看可能并不理想。

标签: c++ copy stdvector move-semantics


【解决方案1】:

你可以std::move

std::vector<std::vector<object>> vvec;
{
    std::vector<object> v;
    v.emplace_back(object());
    vvec.push_back(std::move(v));
}

如果我像下面这样模拟一个类

struct object
{
    object() { std::cout << "default construct\n"; }
    object(object const&) { std::cout << "copy construct\n"; }
    object(object&&) { std::cout << "move construct\n"; }
};

那么上面的 sn-p 代码现在会产生输出

default construct
move construct

因此移动避免了内部副本。

【讨论】:

  • 真的那么简单吗? :D
  • @Ddor 大约 10 年前,语言中添加了令人难以置信的深度魔法,使其变得如此简单。
  • @Ddor 用户4581301 所指的“魔术”用户与“移动语义”和rvalue references 的概念有关,以防您想了解它。
  • std::move 只不过是一个 cast 到右值引用。如果你std::move 是不可移动的(没有实现移动构造函数/移动赋值运算符),那么仍然会执行复制。
  • @JesperJuhl 确实如此,但std::vector 的情况并非如此,它确实实现了移动语义
猜你喜欢
  • 2017-11-19
  • 2011-08-13
  • 2021-01-23
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多