我的数据结构包含三个代表坐标的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;
}
答案 0 :(得分:2)
对它们进行排序的最快方法是不必对它们进行排序。
以一些稍慢的插入为代价,您可以对整个容器进行排序存储,并仅在正确的位置插入。 std::set可以帮到你,或者你可以自己动手。
编辑如果您需要允许比较相等的值,则std::multiset会提供相同的优势。
答案 1 :(得分:0)
重复问题,Fastest way to search and sort vectors是一个比我能给出的好得多的答案。
总结,
你需要一个更好的样本集,5个条目不会告诉你任何事情。你无法击败std :: sort。特别是对你而言,浮点比较将是痛苦的。