C++ 使用 std::move 将映射复制到矢量
C++ copy map to vector with std::move
我是 C++ 的新手,这可能是一个愚蠢的问题,但我现在正在尝试理解 rValue
和 lValue
引用,我想到了这个:
假设我们有一张地图(来自数据库或其他任何东西),我们想将它的所有值复制到一个向量中。
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.: 我觉得题名不是最好的。如果你有更好的欢迎编辑。
Is it right to use std::move
here?
是的。代码看起来不错。
Is it right to use std::move
here?
如果您确定以后不会访问移动的值,是的。
您可能还想使用 std::vector::reserve
在 v
中预分配所需的 space。
v.reserve(v.size() + names.size());
在您显示的情况下,是的,移动就可以了,因为您以后不会使用地图或其值。
如果地图不是一个值(比如它是一个参考),或者您以后需要使用其中的值,那么它就是错误的。
我是 C++ 的新手,这可能是一个愚蠢的问题,但我现在正在尝试理解 rValue
和 lValue
引用,我想到了这个:
假设我们有一张地图(来自数据库或其他任何东西),我们想将它的所有值复制到一个向量中。
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.: 我觉得题名不是最好的。如果你有更好的欢迎编辑。
Is it right to use
std::move
here?
是的。代码看起来不错。
Is it right to use
std::move
here?
如果您确定以后不会访问移动的值,是的。
您可能还想使用 std::vector::reserve
在 v
中预分配所需的 space。
v.reserve(v.size() + names.size());
在您显示的情况下,是的,移动就可以了,因为您以后不会使用地图或其值。
如果地图不是一个值(比如它是一个参考),或者您以后需要使用其中的值,那么它就是错误的。