4

我目前有一个数组pair<double, int>,我使用一个简单的自定义比较器函数对其进行排序,例如

// compare by first
int sort_index_lcomparator(const pair<double, int>& a, const pair<double, int>& b) {
    return a.first < b.first;
}
// then sort simply like
pair<double, int> arr[size];
std::sort(arr, arr + size, sort_index_lcomparator);

我实际上对索引顺序感兴趣,而不是对排序的双打感兴趣。我的问题是我想改变这个结构,取而代之的是一个由两个数组组成的结构,而不是一个结构的数组,即我想优化局部性和自动矢量化,但在这种情况下,我需要一个重载swap,即专门附加到一个类型。我想我需要一些类似于重新定义类型的东西,swapdouble在这样的自定义中保持两个数组同步swap。有没有办法swap在有限的范围内以这种方式“覆盖”?

4

2 回答 2

4

我有一个建议给你:让索引数组成为你排序的数组,并将值保留为全局数组。从那时起:根据接受索引的比较器进行排序,但实际上是根据值进行比较。

于 2012-08-19T20:43:21.040 回答
-2

您应该专门std::sort使用您的自定义“比较器”。

template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

默认情况下sort使用标准比较器,它只比较给定迭代器引用的元素。

使用自定义Compare您可以覆盖它。请注意,它不是函数(在 C++ 中,通常您可能不会将函数作为模板参数传递)。这是一个class。您将此类的对象传递给sort,而该对象应实现以下运算符:

bool operator () (const Type1 &a, const Type2 &b);

所以,你可以调用sort你的数组double。您的比较器应该有指向两个数组开头的指针:doubleint.

对于数组,迭代器解析为指向数组元素的指针。使用数组起始地址,您可以将其转换为索引,并使用它来访问第二个数组。

于 2012-08-19T20:45:51.157 回答