首页 > 解决方案 > 如何使用 list::sort 对对象列表进行排序?

问题描述

我必须根据他们的加班时间订购一份工人名单,所以第一个将是加班时间更长的人。我之前问过这个问题,得到的答案是将此函数与 lambda 一起使用:

class Workers {
private:
    list<Worker> workers;
public:
    Workers() {
    }
    Workers(list<Worker> workers) {
        this->workers = workers;
    }
    void OvertimeHoursReport() {
        list<Worker> workers_Copy;
        workers_Copy = workers;
        workers_Copy.sort([](Worker& lh, Worker& rh) { return lh.Overtimehours() > rh.Overtimehours(); });
        for (list<Worker>::iterator it = workers_Copy.begin(); it != workers_Copy.end(); it++) {
            if ((it)->Overtimehours() > 0) {
                cout << "Name:";
                cout<<(it)->getName();
                cout << ' ';
                cout<<(it)->getLastname();
                cout << ' '<<"Sex: ";
                if ((it)->getSex() == true) {
                    cout << "Male" << ' ';
                }
                if ((it)->getSexo() == false) {
                    cout << "female" << ' ';
                }
                cout << "Overtime Hours: ";
                cout<<(it)->Overtimehours();
                cout << endl;
            }
        }

    }
};

它工作得很好,但我不太了解 lambdas 是如何工作的,即使在网上阅读了它们之后也是如此。有没有办法做同样的事情,但使用列表的排序算法或任何其他方法?

标签: c++listsortinglambda

解决方案


它工作得很好,但我不太了解 lambdas 是如何工作的,即使在网上阅读了它们之后也是如此。有没有办法做同样的事情,但使用列表的排序算法或任何其他方法?

您正在使用 的sort成员函数std::list。有两个重载std::list::sort

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

在您的情况下,您正在使用第二个重载。它允许自定义比较函数对列表中的项目进行排序。使用lambda函数是提供自定义比较函数的一种方式。您可以使用其他方式提供自定义比较功能,例如:

  1. 非成员函数。

    bool compareWorkers(Worker const& lh, Worker const& rh)
    {
       return (lh.Overtimehours() > rh.Overtimehours());
    }
    

    并将其用作:

    workers_Copy.sort(compareWorkers);
    
  2. 中的static成员函数Workers

    static bool compare(Worker const& lh, Worker const& rh)
    {
       return (lh.Overtimehours() > rh.Overtimehours());
    }
    

    并将其用作:

    workers_Copy.sort(Workers::compare);
    
  3. 一个函子类。

    struct CompareWorkers
    {
       bool operator()(Worker const& lh, Worker const& rh) const
       {
          return (lh.Overtimehours() > rh.Overtimehours());
       }
    };
    

    并将其用作:

    workers_Copy.sort(CompareWorkers());
    

推荐阅读