假设我有一个 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/