在 C++ 中生成对的排序向量的有效方法

Efficient way to generate sorted vector of pairs in C++

我正在尝试从一组整数生成排序向量 std::vector<std::pair<int,int>>。通过迭代整数集,整数的值将被设置为该对的第一个值,该对的第二个值将由另一个函数计算。所有对都应根据我的最终向量中的第二个值进行排序。为此,我有两个生成向量的计划:要么我将这对“插入”到正确的位置(通过从向量开始迭代并比较第二个值),要么我简单地进行推回和排序(通过 std::sort 带有一些比较功能)所有对被推入后的整个向量。那么哪种方案效率更高呢? (或者有更好的方法?)

生成整个 vector 并作为最后一步进行排序几乎肯定是可行的方法。假设生成的值是半随机的,尝试插入以保持排序顺序将涉及不断增长的 O(n) 插入成本(O(log n) 二进制搜索成本在理论上不是一个问题,但考虑到半-随机访问,在实践中可能比插入成本更糟糕),使整体构建时间 O(n²)n 插入成本 O(n) 每个工作)。

相比之下,生成整个事物并在最后排序是 O(n) 构建 vectorO(n log n) 对其进行排序。

只有当您要将少量项目插入到现有的大型 vector 中时,才考虑以保留顺序插入其中。当然,如果你在那种情况下,你可能最好使用 std::setstd::multiset(或者在这种情况下,std::multimap<int, int> 将生成的值映射到 int 生成它们)以使修改工作始终如一 O(log n) 每次操作。