【问题标题】:Sorting an std::list that contains structs对包含结构的 std::list 进行排序
【发布时间】:2019-08-08 04:30:41
【问题描述】:

所以我在确定正确使用list::sort() 来处理结构列表时遇到了一些麻烦。相关代码如下:

struct student
{
    char firstnm[20],   
        lastnm[20];     
    int id,             
        grade;
};
list<student> sList;

//Irrelevant code...

cout << "Please enter your own name, id, and grade. (Ex: myfirst mylast 0 12)\n";
cin >> data.firstnm >> data.lastnm >> data.id >> data.grade;
sList.push_back(data);
sList.sort();

我要解决的问题是使用sList.sort()id 排序。但是,我不知道如何正确地将其传递给list::sort()。提前感谢您的帮助/时间!

编辑:解决方案只是将其添加到我的结构中

bool operator < (const student& cmp) const {
   return id < cmp.id;
}

【问题讨论】:

    标签: c++ list sorting stl


    【解决方案1】:

    成员函数std::list::sort() 被重载。 std::list 有一个不带参数的普通成员函数,并使用operator&lt; 对列表的元素进行排序:

    void sort();
    

    它还有一个成员函数模板,带有一个参数comp,用作对元素进行排序的谓词:

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

    假设您要根据 key id升序 对列表中的 student 对象进行排序。您可以为用户定义的 student 类定义 operator&lt; 为:

    bool operator<(student const& a, student const& b) {
       return a.id < b.id;
    }
    

    并使用不带参数的重载:

    sList.sort(); // 1st overload
    

    或者简单地将一个 lambda 表达式传递给带有一个参数的成员函数模板:

    auto cmp = [](auto const& a, auto const& b) {
       return a.id < b.id;
    }; 
    
    sList.sort(cmp); // 2nd overload
    

    使用这种方法,您无需为您的 student 类定义 operator&lt;


    请注意,您不能在std::list 的迭代器上使用std::sort() 算法,因为该算法需要随机访问 迭代器,但std::list 仅提供双向 迭代器。因此,以下代码将无法编译:

    std::sort(sList.begin(), sList.end());
    

    相反,您必须使用std::list 提供的成员函数来对容器的元素进行排序,如上所述。

    【讨论】:

      【解决方案2】:

      你应该看看std::sort。 (https://en.cppreference.com/w/cpp/algorithm/sort) 该函数有多种定义,您可以在其中指定要排序的内容。

      另外,看看那个帖子,我认为这是你需要的:https://stackoverflow.com/a/21234017/6663947

      编辑:

      这是比较器的一个例子:

      sList.sort([](const student & a, const student & b) { return a.id < b.id; });
      

      我没试过,但看起来应该是这样的。另外,这是针对 c++11 的

      希望对你有帮助!

      【讨论】:

      • 谢谢!我想你是正确的。我会开始玩弄它。所以你的意思是,在为小于操作创建重载之后,我需要使用 #include 中的排序,而不是 STL 提供的排序?
      • 是的,所以你需要添加一个比较器。您也可以像以前一样使用 sList.sort(),但使用比较器作为参数...
      • @kseaner 您不必使用来自&lt;algorithm&gt; 标头的sort 或完全包含它。您只需将less 的定义作为函数、函数对象或lambda 传递。您还可以为您定义operator&lt; student-type 并且不要将任何内容传递给sort
      • @kseaner 请注意,您不能使用来自&lt;algorithm&gt;std::sortstd::list 进行排序。它需要随机访问迭代器,如果你给它std::list 迭代器,它就不会编译。这就是 std::list::sort 存在的原因。
      猜你喜欢
      • 2021-07-15
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多