我目前有一个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);
我实际上对索引顺序感兴趣,而不是在排序的双精度中。我的问题是我想改变这个结构而不是一个结构的两个数组而不是一个结构的数组,即我想优化局部性和自动矢量化但在这种情况下我需要一个重载{{ 1}}具体附加到一个类型。我想我需要为swap
类型重新定义swap
的内容,并在这样的自定义double
中保持两个数组同步。有没有办法在有限的范围内以这种方式“覆盖”swap
?
答案 0 :(得分:3)
我有一个提议:将索引数组作为您排序的数组,并将值保存为全局数组。从那时起:基于接受索引的比较器进行排序,但实际上是根据值进行比较。
答案 1 :(得分:-1)
您应该使用自定义“比较器”专门化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
。您的比较器应该指向两个数组的开头:double
和int
。
对于数组,迭代器解析为指向数组元素的指针。使用数组起始地址,您可以将其转换为索引,并使用它来访问第二个数组。