我有一个按递减顺序按键排序的对矢量。 我想有效地将其转换为地图。 这就是我目前所做的事情:
int size = vect.size();
for (int i = 0; i < size; i++)
map[vect[i].key] = vect[i];
向后遍历向量并首先插入具有最低键的值是否有意义?我不确定插入是如何在内部工作的,甚至是否重要......
如何使用map构造函数并将向量传递给它而不是循环?这将重新创建地图,而不是我目前在运行之间做的map.clear()。
我读了一些关于[key] = val的其他SO答案与insert()大致相同但没有处理插入顺序。
答案 0 :(得分:2)
std::map
通常以Red-Black Tree的形式实施。因此,无论是递增还是递减键都无关紧要。它仍会执行O(log n)复杂度和重新平衡的搜索。
您可以使用insert或emplace_hint和“提示”来做什么来加速插入,这是一个迭代器,用于建议插入新元素的位置。
使用范围构建地图不会产生任何影响。
如果不了解有关程序及其处理的数据的详细信息,很难为您推荐最佳数据结构。通常,RB-tree是一般情况下你能得到的最好的(这就是为std::map
选择它的原因。)
希望它有所帮助。祝你好运!
答案 1 :(得分:2)
我认为这很有趣(标准中持续了13年的彻头彻尾的错误)作为答案添加。
Section 23.1.2 of the C++03 specification说,关于“暗示”版本insert(p,t)
,复杂性是:
一般情况下是对数,但如果在 p
之后插入 t ,则摊销会保持不变
这意味着如果您在排序顺序中插入n
个元素,每次都提供正确的提示,那么总时间将是O(n)
,而不是{{ 1}}。即使某些单独的插入将采用对数时间,但每次插入的平均时间仍将是恒定的。
C ++ 11最终将措辞修改为“在 p 之前”,而不是“在 p 之后”,这几乎可以肯定是第一个地点...当纠正的措辞实际上可以在以正向或反向顺序插入元素时使用“提示”(即通过O(n log n)
或container.end()
作为提示。)