类自定义排序的 C++ 向量

Posted

技术标签:

【中文标题】类自定义排序的 C++ 向量【英文标题】:C++ vector of class custom sort 【发布时间】:2013-11-21 12:09:06 【问题描述】:

我有 C++ 代码。有一个类向量。我需要以一种有点自定义的方式对这个向量进行排序。

这是我的课:

class Sales

   public:
      string customer_name;
      string category;
      string aircraft;
      string day;
      string time;
      int week;
      int ticket_price;
      string payment;

   public:
      Sales ()  
         customer_name = "";
         category = "";
         aircraft = "";
         day = "";
         time = "";
         week = 0;
         ticket_price = 0;
         payment = "";
      

      Sales (string f_cat, string airc, string xday, string xtime, int xweek) 
         customer_name = "";
         category = f_cat;
         aircraft = airc;
         day = xday;
         time = xtime;
         week = xweek;
         ticket_price = 0;
         payment = "";
        
;

假设我们有:

vector <Sales> list;

假设该列表已填充记录,我希望按以下逻辑对其进行排序:

sort_string = day + time + week + category + aircraft;

示例记录:

Sunday, 12:00, 1, Comm, b777
Monday, 10:00, 1, Comm, b777
Monday, 10:00, 1, Comm, a321
Monday, 12:00, 1, Comm, a321
Friday, 09:00, 1, Comm, a321

预期排序:

Monday, 10:00, 1, Comm, a321
Monday, 10:00, 1, Comm, b777
Monday, 12:00, 1, Comm, a321
Friday, 09:00, 1, Comm, a321
Sunday, 12:00, 1, Comm, b777

这可能吗?如果是,那么如何?

谢谢。

【问题讨论】:

【参考方案1】:

是的,是的。

定义

bool Sales::operator<( const Sales& other ) // member

bool operator<( const Sales& lhs, const Sales& rhs) // global

并使用std::sort


只有两个 int 变量的示例,因为它们是最简单的:

bool operator<( const Sales& lhs, const Sales& rhs)

    if( lhs.week < rhs.week ) 
         return true;
    else if( lhs.week > rhs.week )  
         return false;

    if( lhs.price < rhs.price ) 
         return true;
    else if( lhs.price > rhs.price )  
         return false;

    // ...

    return false;

当然,你的定义会更复杂,因为其他字段比较复杂(例如工作日),但我希望你明白这一点。

然后:

#include <algorithm>
// ...
std::sort( list.begin(), list.end() );

顺便说一句,list 是变量的坏名称,因为在某些情况下它可能与 std::list 冲突。

【讨论】:

str::sort 如何知道以何种顺序使用哪些变量? 你在上面 Kiril 列出的函数体中定义它。 @ChrisL 我对此并不熟悉。你能给我举个例子吗? 这不是您所需要的,而是一个示例。如果您想按周排序,那么您将定义bool operator&lt;( const Sales&amp; lsh, const Sales&amp; rhs) return (lhs.week &lt; rhs.week); //即如果周在左边小于右边返回true else false。 std::sort 使用此逻辑来订购您的容器 @kiril 对我来说看起来不错 - 省得我在评论中写它,我现在已经支持你的答案了。【参考方案2】:

如果你将实现布尔函数作为成员,它必须是 const 类型

    bool operator<( const Sales& rhs) const 
        if (customer_name < rhs.customer_name ) return true; 
        if (category < rhs.category ) return true; 
        return false;
    

查看工作example

【讨论】:

为什么“必须”?也许“应该”? 直到我放上它才为我编译。 @BorisIvanov 这是我在编译 test.cpp:73: error: a function-definition is not allowed here before ':' token 时得到的,因为 for loops /usr/include/c++/4.8/bits/stl_algo.h:2269:19: 错误:将 'const Sales' 作为 'bool Sales::operator

以上是关于类自定义排序的 C++ 向量的主要内容,如果未能解决你的问题,请参考以下文章

用于对包含指向自定义类对象的指针的向量进行排序的比较器

C++ std::vector 自定义排序

使用自定义排序对向量进行排序

自定义对象的排序向量

使用自定义谓词对 numpy 数组进行排序

在 C++ 中对向量进行分组排序