我有这样的地图
std::unordered_map<std::string, std::unique_ptr<V>> map;
我想最终在地图上所有其余的V
上运行一个函数,所以我执行以下操作:
for (auto&& [_, v] : map) {
func(std::move(v));
}
这有效,但是我一直很天真地假设编译器将忽略键值,因为它们没有在for循环中使用。现在,我正在考虑迭代器将const std::string
作为第一个参数,因此确实有很多不必要的字符串构建正在进行。这里到底发生了什么(关于键值)?有没有办法避免任何字符串复制?
在C ++标准中,[stmt.ranged]指定基于范围的for循环具有与某个普通for循环相同的语义。您的情况是:
{
auto &&__range = map ;
auto __begin = __range.begin() ;
auto __end = __range.end() ;
for ( ; __begin != __end; ++__begin ) {
auto&& [_, v] = *__begin;
func(std::move(v));
}
}
取消引用std::unordered_map
的迭代器将返回引用。然后,带有auto&&
的结构化绑定指向一个引用,因此不进行复制。