【发布时间】:2016-10-06 12:05:46
【问题描述】:
我有一个数据结构,它由三个表示坐标的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;
}
【问题讨论】:
-
了解我的问题出了什么问题会很有帮助。
-
“最快的排序方式”几乎是过于宽泛的定义。这取决于太多的事情:您的编译器和选项、您的目标系统架构、要排序的元素数量、排序之前元素的排列方式。您很可能必须自己实现一些算法并使用真实数据运行性能测试
-
而 99% 的情况下,答案是“你可以编写和调试这个几百行的文件,它平均会比
std::sort快 0.5%”。只需使用std::sort。 -
取决于
how fast您是否需要它以及您要对多少数据集执行排序?如果您需要它更快,我建议将double连同其在向量中的原始索引一起存储在一个单独的容器中。这将允许在排序时将更多元素加载到缓存中。但是,稍后访问向量元素可能会由于通过索引进行随机访问而使性能下降一点。所以,这一切都取决于你真正想要什么。 -
@Chiel 如果仅在字段
d上进行排序并且不使用i、j或k,那么您可能得到一个通过将i、j和k重新排序到Data指向的另一个结构中来获得优势。这将减少一些复制开销。然而,这里的优势可以忽略不计,并且会使其他操作慢得多。