[英]Sorting an std::list that contains structs
所以我在弄清楚list::sort()
关于结构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;
}
成员函数std::list::sort()
已重载。 std::list
具有一个普通成员函数,该函数不带任何参数,并使用operator<
对列表的元素进行排序:
void sort();
它还具有一个成员函数模板,该模板带有一个参数comp
,用作对元素进行排序的谓词:
template<class Compare>
void sort(Compare comp);
假设您要根据键 id
升序对列表中的student
对象进行排序。 您可以为用户定义的student
班级定义operator<
,方法是:
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<
。
请注意,您不能在std::list
的迭代器上使用std::sort()
算法,因为该算法需要随机访问迭代器,而std::list
仅提供双向迭代器。 因此,以下代码将无法编译:
std::sort(sList.begin(), sList.end());
相反,您必须使用std::list
提供的成员函数来对容器的元素进行排序,如上所述。
您应该看一下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
希望能帮助到你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.