unordered_multimap::equal_range slow

unordered_multimap::equal_range slow

本文关键字:slow range equal unordered multimap      更新时间:2023-10-16

我希望unordered_multimap::equal_range的复杂度为平均常数,但以下内容并不像预期的那样随n线性扩展:

#include <iostream>
#include <tr1/unordered_map>
#include <cstdlib>
using namespace std::tr1;
using namespace std;
int main(){
        int n;
        cin >> n;
        unordered_map<int, int> um;
        for(int i=0; i<n; ++i){
                um.insert(make_pair(i%100000, i));
                pair<unordered_map<int, int>::iterator,unordered_map<int,int>::iterator > t = um.equal_range(i);
        }
}


$ g++ testbr.cpp
$ time echo 10000 | ./a.out 
real    0m0.065s
user    0m0.060s
sys     0m0.003s
$ time echo 100000 | ./a.out 
real    0m4.492s
user    0m4.490s
sys     0m0.003s

有办法解决这个问题吗?

编辑:在没有equal_range的情况下,它的缩放效果与预期完全一样
此外,如果我插入具有相同键0的所有元素(并且总是调用equal_range(0)),它会按预期缩放,即使boost doc声明相等的范围在平均O(count(k))。。。?

这似乎是libstdc++中的一个错误,我在任何地方都找不到错误报告,但使用#include <unordered_map>-std=c++11编译,我得到了预期的行为。

这不是缩放O(n),而是缩放O(n * n)(您调用std::equal_range n次)!

std::equal_range移出内部循环。