在C ++中对数据结构进行排序的最快方法

时间:2016-06-06 18:57:57

标签: c++ sorting c++11 std

我的数据结构包含三个代表坐标的int值,以及一个代表该坐标值的double。我想将它们存储在一起,并根据它们进行排序。值不是唯一的。现在,我将它们放在struct中,然后使用lambda对它们进行排序,如下面的代码所示。由于这是一段性能关键的代码,我正在寻找一种能够实现最快排序的实现。该列表将包含10 ^ 6到10 ^ 7个元素。

解决这个问题最优雅的方法是什么?我不是试图使用std::sort,但我主要询问是否将数据存储在struct中是最佳解决方案,还是有更好的替代方案?

#include <vector>
#include <algorithm>
#include <iostream>

struct Data
{
    int i;
    int j;
    int k;
    double d;
};

int main()
{
    std::vector<Data> v;

    v.push_back({1,2,3,0.6});
    v.push_back({1,2,3,0.2});
    v.push_back({1,2,3,0.5});
    v.push_back({1,2,3,0.1});
    v.push_back({1,2,3,0.4});

    std::sort(v.begin(), v.end(), [](const Data& a, const Data& b)
            { return a.d < b.d; });

    for (auto d : v)
        std::cout << d.i << ", " << d.j << ", "
                  << d.k << ", " << d.d << std::endl;

    return 0;
}

2 个答案:

答案 0 :(得分:2)

对它们进行排序的最快方法是不必对它们进行排序。

以一些稍慢的插入为代价,您可以对整个容器进行排序存储,并仅在正确的位置插入。 std::set可以帮到你,或者你可以自己动手。

编辑如果您需要允许比较相等的值,则std::multiset会提供相同的优势。

答案 1 :(得分:0)

重复问题,Fastest way to search and sort vectors是一个比我能给出的好得多的答案。

总结,
你需要一个更好的样本集,5个条目不会告诉你任何事情。你无法击败std :: sort。特别是对你而言,浮点比较将是痛苦的。