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)を呼び出すと)、ブーストドキュメントに等しい範囲が平均O(count(k))であると記載されていても、期待どおりにスケーリングされます...?