【发布时间】:2021-05-31 00:07:55
【问题描述】:
我正在尝试用 C++ 编写一个自定义比较器来对向量进行排序。为了简单起见,我会说我的排序标准是所有偶数值都应该在所有奇数值之前,我正在尝试为此编写一个自定义比较器。但我需要确保保留所有偶数元素和所有奇数元素的相对顺序。
我正在使用此代码:
bool mysort(int arg1,int arg2){
return arg1%2==0;
}
int main(){
vector<int> v({1,3,2,4,5,7,9,6,8,11,10,12});
stable_sort(v.begin(),v.end(),mysort);
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
return 0;
}
根据我的理解,当 mysort() 返回 true 时,这意味着允许第一个参数 (arg1) 在第二个参数 (arg2) 之前。这就是我在比较器中使用return arg1%2==0; 的原因。
但我得到的输出是12 10 8 6 4 2 1 3 5 7 9 11。这意味着,偶数元素的相对顺序是相反的。同时,奇数元素的相对顺序被保留。
相反,如果我在mysort() 比较器中使用return i%2==0 && j%2!=0;,我得到的输出是2 4 6 8 10 12 1 3 5 7 9 11。它保留了所有奇数和偶数元素的相对顺序。
为什么会出现这种行为?编写自定义比较器并保留相似元素的相对顺序的最佳方法是什么?提前谢谢你。
【问题讨论】:
-
@NateEldredge 它甚至没有这样做,因为它忽略了一个参数。 (不确定是哪一个,因为它们都同名!)正如所写的那样,2 在 4 之前 并且 4 在 2 之前。
-
虽然这不是您问的问题,但如果您真的想根据每个元素的某些属性稳定地重新排序容器,请查看stable_partition。鉴于您的示例,它可能比完整排序算法更适合。
-
@RaymondChen 抱歉,这是参数名称的错字。现在已修复。参数是 arg1 和 arg2
-
@DaveS 我不是在寻找像 stable_partition 这样的东西。但现在看起来它对我正在做的事情很有用。谢谢
标签: c++ sorting c++14 comparator stable-sort