unordered_multimap::equal_range slow
unordered_multimap::equal_range slow
我希望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
移出内部循环。
相关文章:
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- C++ 向量加减抛出"expression: vector subscript out of range."错误
- 使用 range-v3 读取包含逗号分隔数据的行
- 迭代的"range-based for"召唤
- 如何解决'vector subscript out of range'错误?
- 如何检查 range:: 算法(如 find_if)是否返回了值?
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- cuda 9.2 curand_init extremely slow
- "[ptr, ptr+len) must be a valid range"是什么意思?
- c++ 中的 range-for 会调用项的复制构造函数吗?
- 如何创建一个版本的 boost::range::transform,该版本具有用于捕获上下文的额外参数
- 如何使用 range-v3 获取集合的所有权?
- QList::operator[]中的断言失败<T>:QJoysticks 中的"index out of range"
- 尝试获取矩阵的正确对角线会导致"vector out of range"错误
- 叮叮当当的'range-loop-analysis'诊断是关于什么的?
- Boost Range适配器制作集合
- std::remove, std::move(range) and moved-from elements
- 如果 int 是"not within the enums range",为什么将 int 转换为强类型枚举会编译?
- 范围中的"range"和"view"有什么区别sv3 ts?
- 如何修复c ++中的错误"vector iterators in range are from different containers"?