假设我有一个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
答案 0 :(得分:5)
除非编译器能够证明循环中发生的任何事情都没有修改k,是的,每次都会调用它。就此而言,它每次迭代都会进行表查找。 (很可能编译器将重用散列但是无论如何都会单独执行查找。)标准不允许实现只删除这样的操作,但它确实允许它们进行任何优化没有任何明显的效果(&#34; as-if&#34;规则)。
编写循环的更简洁,更有效的方法是:
for(int val : table[k]){}
只需要进行一次表查找。