排序包含结构的std :: list

时间:2019-03-17 18:42:56

标签: c++ list sorting stl

因此,我很难确定关于结构列表的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;
}

2 个答案:

答案 0 :(得分:2)

成员函数std::list::sort()已重载。 std::list有一个普通的成员函数,该函数不带任何参数,并使用operator<对列表中的元素进行排序:

void sort();

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

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

假定您要根据 student升序对列表中的id对象进行排序。您可以为用户定义的operator<类定义student,如下所示:

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

使用这种方法,您无需为operator<类定义student


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

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

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

答案 1 :(得分:0)

您应该看一下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

希望有帮助!