自定义比较器,用于实现多个排序键的排序

时间:2017-10-03 04:46:46

标签: c++ arrays sorting compare

有一个整数数组,有一个数字M. 数组需要按照以下标准排序:

(arr[i] % M, arr[i] / M)

也就是说,排序是根据arr[i] % M的结果确定的,如果是平局,则根据arr[i] / M的结果确定。

我知道可以像这样传递自定义比较器:

std::sort(arr, arr + n, comp) // comp is a custom comparator.

但如果我简单地应用sort两次,答案可能就不对了。

我们可以使用std::sort()来实现此功能吗?

3 个答案:

答案 0 :(得分:4)

简单地:

auto proj = [&](int e) { return std::make_tuple(e % M, e / M) };
std::sort(std::begin(arr),
          std::begin(arr) + n,
          [&](int lhs, int rhs) { return proj(lhs) < proj(rhs); });

答案 1 :(得分:1)

您希望按arr[i]%m排序值,如果两个值相等,则您希望按arr[i]/m排序。

bool cmp(int a,int b)
{
    if(a%m < b%m)
        return true;
    if(a%m > b%m)
        return false;
    return a/m < b/m;
}

有关工作示例,请参阅here

答案 2 :(得分:-1)

arr[i]%Marr[i]/M现在以sort(arr,arr+n)的升序顺序调用arr[i]%M,如果arr[i]%Marr[i]/M相等。如果你想要一个不同的排序写一个函数并调用类似sort(arr,arr+n,func)的排序。 也看到这个。 http://www.cplusplus.com/reference/algorithm/sort/
http://www.cplusplus.com/reference/utility/pair/

vector<pair<int,int> > v;
for(int i = 0;i < n;i++){
    v.push_back(a[i]%m,a[i]);
}
sort(v.begin(),v.end());

此处按a[i]排序相当于按a[i]/n排序,您可以按v[i].second获取第二个元素。