有效地将值插入地图.更好地增加或减少键

Efficiently inserting values into a map. Better incrementing or decrementing keys?

本文关键字:增加 更好 插入 地图 有效地      更新时间:2023-10-16

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()作为提示传递)。