我有一个元素向量,它们根据一些外部值进行排序。它是一个大容器,查找排序值相对昂贵。在某些时候,需要重新排序一个元素(仅)。重新排序该元素的最有效方法是什么? std::sort()
向量?擦除 - 插入元素?将元素与其直接邻居进行比较?
编辑:澄清一下,通过擦除 - 插入元素我的意思是这样的:
// erase the key and then insert-sort it
auto iter = std::find(keys.begin(), keys.end(), key);
keys.erase(iter);
SortedInsert(keys, index, <cmp>);
EDIT2:出于其他性能原因,容器需要是一个向量
答案 0 :(得分:1)
您可以使用以下内容:
std::sort(myvector.begin(), myvector.end)
认为s part of STL and it
已经很好地实施了。
答案 1 :(得分:1)
如果要在排序向量中的正确位置插入元素,则应使用upper_bound
获取迭代器并将其传递给insert
以将元素放在正确的位置:
vec.insert(std::upper_bound(vec.begin(), vec.end(), item), item);
请注意,upper_bound
会很快(O(log n)
),但插入速度可能很慢(O(n)
),因为它必须移动插入点之后的所有元素。
然而,在向量的末尾插入并调用std::sort
是O(n log n)
所以它是最糟糕的,至少在大向量上!
vec.insert(item);
std::sort(vec.begin(), vec.end());
另一个选项可能是在向量的末尾插入,然后使用前一个元素移动,直到它更低或相等。在这种情况下,插入是分摊O(1)
,您必须进行O(n)
交换。
我担心没有像O(log n)
那样的list
解决方案。
答案 2 :(得分:0)
考虑将值存储在MAP中。
答案 3 :(得分:0)
您可以查看101010的答案。我认为这是非常明确的解释。您可以根据案例进行分析。