C++ - 循环中的 unordered_map - 执行哈希运算符()

标签 c++ c++11 unordered-map

假设我有一个 std::unordered_map<K,std::set<int>> table 。在循环中:

for(auto it = table[k].begin(); it != table[k].end(); ++it){}

每次迭代都会调用 K 的哈希算子()吗?编译器是g++带有标志:-m64 -g -std=c++11 -O3

最佳答案

除非编译器可以证明 k 没有被循环中发生的任何事情修改,否则它每次都会被调用。就此而言,它也会在每次迭代中进行表查找。 (编译器很可能会重用散列,但无论如何都会进行单独的查找。)该标准不允许实现仅删除这样的操作,但它确实允许他们进行任何他们喜欢的优化,但没有任何优化可见效果(“假设”规则)。

编写循环的更干净、更有效的方法是:

for(int val : table[k]){}

只需要进行一次表查找。

关于C++ - 循环中的 unordered_map - 执行哈希运算符(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48327936/

相关文章:

c++ - 如何使用模板重载流插入运算符?

c++11 - 模板元编程 - 错误 : template parameters not used in partial specialization

c++ - 是否允许在 std::declval<T> 上使用 decltype (函数本身,而不是调用它的结果)?

c++ - 为什么右值引用绑定(bind)到 xvalue 在我的代码中不起作用?

c++ - unordered_map 的哈希函数是确定性的吗?

c++ - 具有特定类型但没有模板的数据结构

c++ - Boost.Spirit 语法。属性和 _val 问题

C++:std::unordered_map 保证是基于节点的吗?

c++ - unordered_map 元素被删除

c++ - 互斥锁出错了?