使用std :: move将C++复制映射到vector

Cil*_*nco 2 c++ rvalue-reference c++11

我相对来说是C++的新手,这可能是一个愚蠢的问题,但我现在正试图理解rValuelValue引用这一点,我想到了:

假设我们有一个地图(来自数据库或其他),我们想要将它的所有值复制到矢量.

void insertItems(std::vector<std::string>& v)
{
    std::map<int, std::string> names = loadFromDb();

    for (auto& kv : names )
    {
        v.push_back(std::move(kv.second));
    }
}
Run Code Online (Sandbox Code Playgroud)

std::move在这里使用是对的吗?std::string提供了一个移动构造函数(可能不是用于字符串,但对于较大的对象),移动构造函数比复制构造函数快得多.我们也知道我们不会在其他地方使用地图的项目,一旦我们离开该功能它们就会超出范围.我的推定是对的吗?

我不能在我的思想中看到矛盾,但这是一个复杂的话题,我害怕错过一些东西. PS:我认为问题名称不是最好的.如果你有一个更好的人随时编辑它.

Vit*_*meo 6

std::move在这里使用是对的吗?

如果您确定将来不会访问移动的值,是的.


您可能还想使用std::vector::reserve预分配所需的空间v.

v.reserve(v.size() + names.size());
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的意思是`v.reserve(v.size()+ names.size());`因为`v`最初可能不是空的. (2认同)
  • @Cilenco:`std::vector` 在内部使用指向堆分配数组的指针来存储值。该数组具有固定大小。当数组已满时,将执行重新分配并将前一个数组中的所有值移动到新数组中。提前保留可以防止这种情况发生(当您知道要在向量中推送多少元素时)。 (2认同)