C ++ - 循环上的unordered_map - 执行hash运算符()

时间:2018-01-18 18:24:05

标签: 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

1 个答案:

答案 0 :(得分:5)

除非编译器能够证明循环中发生的任何事情都没有修改k,是的,每次都会调用它。就此而言,它每次迭代都会进行表查找。 (很可能编译器将重用散列但是无论如何都会单独执行查找。)标准不允许实现只删除这样的操作,但它确实允许它们进行任何优化没有任何明显的效果(&#34; as-if&#34;规则)。

编写循环的更简洁,更有效的方法是:

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

只需要进行一次表查找。