【问题标题】:C++ list::sort of classes by membersC++ list::sort of classes by members
【发布时间】:2015-03-13 00:25:17
【问题描述】:

如何按某个成员变量对类列表进行排序?

class Klasse {
  int _a;
  int _b;

}

...
list<Klasse> liste;
liste.sort();   // sorts by _a
liste.sort(?);  // how to sort by _b now?

【问题讨论】:

标签: c++ list sorting categories member


【解决方案1】:

您将使用comparator object。这是一个使用 lambda 的示例。

std::list<Klasse> liste;
liste.sort([](Klasse const & lhs, Klasse const & rhs) {
    return lhs._b < rhs._b;
});

【讨论】:

  • C++11 或更高版本?如果你的编译器支持这些东西,它们就很棒。
  • C+11 很漂亮 :) 不错!
  • 顺便说一句,lambda 不是 C++ 新手容易理解的东西,所以如果没有进一步的参考,这可能不是最好的答案。
【解决方案2】:

See the reference.

您可以编写一个比较函数 - 基本上可以使用列表元素类型的两个参数调用的任何内容,并且此调用返回可转换为 bool 的值。这样的“任何东西”可以是 lambda、函数对象,或者只是一个函数:

bool klasse_sort_by_b(const Klasse& l, const Klasse& r)
{
    return l._b < r._b;
}

liste.sort(klasse_sort_by_b);

【讨论】:

    【解决方案3】:

    你需要这个排序实现:

    template<typename Compare>    
    void sort (Compare comp);
    

    然后传入一个比较函数,如:

    bool compareByA( const Klasse& first, const Klasse& second ){
     return first._a < second._a;
    }
    

    然后调用它:

    std::list<Klasse> lst;
    ...
    lst.sort(compareByA);
    lst.sort(compareByB);
    

    【讨论】:

      【解决方案4】:

      http://www.cplusplus.com/reference/list/list/sort/

      您应该在链接中编写自己的比较器、示例和用法;)

      这是承诺的代码示例

      (感谢建设性的批评)

       bool compare_by_b (const Klasse& first, const Klasse& second)
          {
            return first._b < second._b ;
          }
      
       liste.sort(compare_by_b);
      

      【讨论】:

      • 您应该在答案中包含代码,而不是链接到外部资源。
      • 他回答了这个问题(虽然很快),并提供了参考。可能不是最彻底的解释,但比投反对票更有价值!
      • 我同意,但他确实只是链接到某个地方。他说“写一个比较器”,这是绝对正确的,如果链接的网站在某一时刻出现故障,甚至可能足以让 OP 开始。
      【解决方案5】:

      是的,您所要做的就是实现一个比较器类,或者重载比较Klasse::operator&lt; 运算符。有关sort 方法的参考,请参阅this

      【讨论】:

        猜你喜欢
        • 2022-12-02
        • 2022-11-14
        • 2011-02-03
        • 2019-06-14
        • 2021-03-16
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多