【发布时间】:2016-03-24 08:37:30
【问题描述】:
目前我的项目中有以下代码:
std::vector<int> vectorOfFirsts;
std::set<double> setOfSeconds;
std::list<std::pair<int,double>> cachedList;
// do something to fill the list
for (const auto& pair : cachedList)
{
vectorOfFirsts.push_back(pair.first);
setOfSeconds.insert(pair.second);
}
这个列表会很大,并且只需要填充向量和集合(即它的内容可以无效)。我现在的问题是,如果以下优化是个好主意:
for (const auto& pair : cachedList)
{
vectorOfFirsts.push_back(std::move(pair.first));
setOfSeconds.insert(std::move(pair.second));
}
在 pair.first 上调用 std::move 会以某种方式使 pair.second 无效吗?这段代码会为循环提供任何加速吗?我知道填充向量/集合而不是列表可能是个好主意,但是列表是通过一些我无法控制/没有时间深入研究的遗留代码填充的。
【问题讨论】:
-
首先,一般来说,你不能从
const的东西移开 -
仅供参考,您应该更喜欢
std::move(pair).first。它更智能,因为它考虑了引用类型等。 -
你对
std::moveint或double一无所获。无论如何,它是一个副本。 -
另外,移动原始类型的尝试会退回到副本
-
@Stefan 如果您不再需要
cachedList则可以,前提是您删除const