【问题标题】:Sorting a list by a struct member in c++在 C++ 中按结构成员对列表进行排序
【发布时间】:2016-12-31 15:06:01
【问题描述】:

我有一个用这个结构填充的列表:

struct singlePaymentStruct
{
    std::string payer;      
    int payment;            
    double amount;          
    std::time_t timeRec;    

    singlePaymentStruct() {
                            payer="Empty"; 
                            payment=0; 
                            amount=0;
                            timeRec = time(0);
                          }
};

我希望能够按任何字段对该列表进行排序。我该怎么做? 我不太明白 sort 方法如何处理比记录列表更复杂的东西...

找到解决方案:

singlePaymentList.sort( []( const singlePaymentStruct &a, const singlePaymentStruct &b)
                                                          {return a.payer > b.payer;} 
                      );

【问题讨论】:

  • 你在用哪本书?
  • 没有书。到目前为止,甚至没有一些互联网教程 - 只有 msdn。
  • 那是你的问题。
  • 好吧,我现在的主要问题是我使用了一个带有列表的结构,结果发现它不像我最初想象的那么容易排序。

标签: c++ list sorting struct


【解决方案1】:

1.重载运算符

你可以通过重载来做到这一点

struct Foo{
    int bar;
    bool operator<(Foo &x){
        return bar < x.bar;
    }
};

2.使用 lambda 表达式 (what is lambda expression?)

Foo array[10];
std::sort(array,array + 10,[](Foo const &l, Foo const &r) { 
          return l.bar < r.bar; });

3.使用自定义比较函数

如果事先知道可能用于排序的字段,那么实现专门用于排序的自定义比较函数可能更容易阅读。

struct Foo {
  int bar;
  SpecialType daa;  // Assume daa.IsLessThan() available.

  static bool lessBar(const Foo& l, const Foo& r) {
    return l.bar < r.bar;
  }
  static bool lessDaa(const Foo& l, const Foo& r) {
    return l.daa.IsLessThan(r.daa);
  }
};

Foo array1[10];  // To be sorted by Foo::bar
Foo array2[10];  // To be sorted by Foo::daa
std::sort(array1, array1+10, Foo::lessBar);
std::sort(array2, array2+10, Foo::lessDaa);

【讨论】:

  • singlePaymentList.sort( []( const singlePaymentStruct &a, const singlePaymentStruct &b) {return a.payer > b.payer;} );
【解决方案2】:

std::sort 接受第三个可选参数,即比较器函数。此函数在元素之间的行为应为 &lt;(即,当第一个“小于”第二个时,返回 true

例如,在增加payment 值时对结构中的std::vector 进行排序,您可以做的是:

std::sort(data.begin(), data.end(),
          [](const singlePaymentStruct& a, const singlePaymentStruct& b) {
              return a.payment < b.payment;
          });

【讨论】:

    【解决方案3】:

    设数组为struct singlePaymentStruct a[N] sort(a,a+N,cmp);

    bool cmp(struct singlePaymentStruct x, struct singlePaymentStruct y)
    {
       return x.field < y.field ; //or anything you want to do and return boolean
    }
    

    它是如何工作的?

    简单地说,它基本上使用了一些排序算法,例如快速排序或合并排序。

    为什么要指定比较函子?

    我们需要比较器函子来决定元素的顺序。 基本的事情是在任何排序算法中,基本操作是比较......如果我们可以指定我们基本上控制排序操作。

    希望现在你能把这些碎片拼凑起来。这就是为什么cmp() 采用两个值,它将根据它们的顺序进行比较。

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多