簡體   English   中英

排序包含結構的std :: list

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM