如何根据其中一个成员的值对结构数组进行排序,在另一个成员的基础上打破联系?

时间:2014-01-05 14:26:52

标签: c++ c arrays sorting structure

假设有一个结构:

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打破关系,我会做什么修改(目前它以先到先得的方式打破关系)。

3 个答案:

答案 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);
          });