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

时间:2017-02-16 18:55:28

标签: c++ c++11 rvalue-reference

我是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));
    }
}

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

我看不出我的想法中的矛盾,但这是一个复杂的话题,我害怕错过一些东西。 P.S。:我认为问题名称不是最好的。如果你有一个更好的人可以随意编辑它。

3 个答案:

答案 0 :(得分:6)

  

在这里使用std::move是否正确?

如果您确定以后无法访问移动的值,是的。

您可能还想使用std::vector::reserve预先分配v中所需的空格。

v.reserve(v.size() + names.size());

答案 1 :(得分:3)

  

在这里使用std::move是否正确?

呀。代码看起来很好。

答案 2 :(得分:1)

如果您显示,则移动将会很好,因为您以后不会使用地图或其值。

如果地图不是一个值(就像它是一个参考),或者您需要稍后使用其中的值,那么它就错了。