[英]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.