有效地将值插入地图.更好地增加或减少键
Efficiently inserting values into a map. Better incrementing or decrementing keys?
i有一个对键下排序的对向量。我想有效地将其转换为地图。这就是我目前要做的:
int size = vect.size();
for (int i = 0; i < size; i++)
map[vect[i].key] = vect[i];
首先将向量向后遍历矢量和插入值最低的值有一点吗?我不确定插入方式在内部的工作方式以及是否重要...
使用MAP构造函数并将向量传递到它而不是循环中?这将是重新创建地图,我目前在运行之间进行的map.clear()。
我读了其他一些,因此关于[key] = val的答案与insert()大致相同,但没有涉及插入顺序。
std::map
通常以红黑树的形式实现。因此,无论您是递增还是减少密钥并不重要。它仍将使用O(log n)复杂性和重新平衡进行搜索。
您可以采取的措施来加快插入的速度是使用"提示"使用插入或emplace_hint,这是迭代器用作插入新元素的建议。
用范围构建地图不会有所作为。
很难在不知道有关程序及其处理数据的详细信息的情况下为您推荐最佳数据结构。通常,rb-tree是一般情况下可以获得的最好的(这就是为什么它是std::map
选择实现的原因)。
希望它有帮助。祝你好运!
我认为这足够有趣(标准中持续了13年的彻底错误)可以添加为答案。
C 03规范的第23.1.2节说,关于"暗示"版本insert(p,t)
,复杂性是:
一般而言,如果 t 在 p p
之后插入,则摊销常数
这意味着,如果您将n
元素插入排序订单,每次提供正确的提示,则总时间为O(n)
,而不是O(n log n)
。即使某些单独的插入时间将需要对数时间,但每个插入的平均时间仍然是恒定的。
c 11最终修复了措辞以读取"在 p 之前",而不是"在 p 之后",这几乎可以肯定是第一个中的含义位置...和校正后的措辞实际上使使用"提示"在向前或反向顺序插入元素时使用"提示"(即将container.end()
或container.begin()
作为提示传递)。
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 哪种方法更好,性能明智
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 寻求更好地理解标准::访问
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 如何更好地检查两个 char 变量是否在一组值中?
- 有没有更好的方法对C++中的三个整数进行排序?
- 什么模板用法在阶乘中更好
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 比使用 s.str().c_str() 更好的表达?
- 有效地将值插入地图.更好地增加或减少键