从具有unique_ptr值的unordered_map移出的最佳方法

问题描述 投票:0回答:2

我有这样的地图

std::unordered_map<std::string, std::unique_ptr<V>> map;

我想最终在地图上所有其余的V上运行一个函数,所以我执行以下操作:

for (auto&& [_, v] : map) {
  func(std::move(v));
}

这有效,但是我一直很天真地假设编译器将忽略键值,因为它们没有在for循环中使用。现在,我正在考虑迭代器将const std::string作为第一个参数,因此确实有很多不必要的字符串构建正在进行。这里到底发生了什么(关于键值)?有没有办法避免任何字符串复制?

c++ c++17 move
2个回答
1
投票

在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));
    }
}

1
投票

取消引用std::unordered_map的迭代器将返回引用。然后,带有auto&&的结构化绑定指向一个引用,因此不进行复制。

© www.soinside.com 2019 - 2024. All rights reserved.