假设有一个结构:
struct x
{
int a,b,c;
};
结构数组包含arr [0] = {4,2,5},arr [1] = {6,3,1},arr [2] = {4,1,8}
那么我们如何根据成员'a'的值按升序对这个数组进行排序。 领带将根据成员'b'的价值被打破。
排序后的数组应该是:arr [2],然后是arr [0],然后是arr [1]。
我使用过qsort(arr,n,sizeof(struct x),compare);
将比较功能定义为
int compare(const void* a, const void * b)
{
return (*(int*)a-*(int*)b);
}
如果我必须按照成员b打破关系,我会做什么修改(目前它以先到先得的方式打破关系)。
答案 0 :(得分:2)
int compare(const void* a, const void * b){
struct x x = *(struct x*)a;
struct x y = *(struct x*)b;
return x.a < y.a ? -1 : (x.a > y.a ? 1 : (x.b < y.b ? -1 : x.b > y.b));
}
答案 1 :(得分:2)
如果您使用的是C而不是C ++,可以通过此compare()
:
int compare(const void* a, const void* b) {
struct x s_a = *((struct x*)a);
struct x s_b = *((struct x*)b);
if(s_a.a == s_b.a)
return s_a.b < s_b.b ? -1 : 1; //the order of equivalent elements is undefined in qsort() of stdlib, so it doesn't matter to return 1 directly.
return s_a.a < s_b.a ? -1 : 1;
}
如果您想在成员a和b相等时根据成员c断开关系,请在if-else
中添加更多compare()
个语句。
答案 2 :(得分:1)
将std::sort
与适当的比较器一起使用。此示例使用std::tie
首先使用a
然后使用b
来实现词典比较,但您可以手动编写自己的比较。唯一的要求是它满足严格的弱排序:
bool cmp(const x& lhs, const x& rhs)
{
return std::tie(lhs.a, lhs.b) < std::tie(rhs.a, rhs.b);
}
std::sort(std::begin(arr), std::end(arr), cmp);
或使用lambda:
std::sort(std::begin(arr),
std::end(arr),
[](const x& lhs, const x& rhs)
{
return std::tie(lhs.a, lhs.b) < std::tie(rhs.a, rhs.b);
});