unordered_multimap :: equal_range slow

时间:2012-07-17 09:28:18

标签: c++ g++ tr1 unordered-map

我希望unordered_multimap :: equal_range处于平均常量复杂度,但是下面的代码不能按预期线性扩展:

#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))...?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

std::equal_range移出内循环。