[英]Sorting a list by a struct member in c++
我有一個列表填充此結構:
struct singlePaymentStruct
{
std::string payer;
int payment;
double amount;
std::time_t timeRec;
singlePaymentStruct() {
payer="Empty";
payment=0;
amount=0;
timeRec = time(0);
}
};
我希望能夠按任何字段對該列表進行排序。 我到底該怎么做? 我不太了解排序方法如何處理比僅記錄列表更復雜的內容...
找到解決方案:
singlePaymentList.sort( []( const singlePaymentStruct &a, const singlePaymentStruct &b)
{return a.payer > b.payer;}
);
1.重載運算符<
您可以通過重載<運算符來實現
struct Foo{
int bar;
bool operator<(Foo &x){
return bar < x.bar;
}
};
2.使用lambda表達式 (什么是lambda表達式?)
Foo array[10];
std::sort(array,array + 10,[](Foo const &l, Foo const &r) {
return l.bar < r.bar; });
3,使用自定義比較功能
如果用於排序的可能字段是事先已知的,則可能更容易閱讀以實現專門用於排序的自定義比較功能。
struct Foo {
int bar;
SpecialType daa; // Assume daa.IsLessThan() available.
static bool lessBar(const Foo& l, const Foo& r) {
return l.bar < r.bar;
}
static bool lessDaa(const Foo& l, const Foo& r) {
return l.daa.IsLessThan(r.daa);
}
};
Foo array1[10]; // To be sorted by Foo::bar
Foo array2[10]; // To be sorted by Foo::daa
std::sort(array1, array1+10, Foo::lessBar);
std::sort(array2, array2+10, Foo::lessDaa);
std::sort
接受第三個可選參數,它是比較器函數。 此函數應在元素之間表現為<
(即第一個元素“小於”第二個元素時返回true
。
例如,在增加payment
金額時對結構的std::vector
進行排序,您可以做的是:
std::sort(data.begin(), data.end(),
[](const singlePaymentStruct& a, const singlePaymentStruct& b) {
return a.payment < b.payment;
});
令數組為struct singlePaymentStruct a[N]
sort(a,a+N,cmp)
;
bool cmp(struct singlePaymentStruct x, struct singlePaymentStruct y)
{
return x.field < y.field ; //or anything you want to do and return boolean
}
簡單地說,它基本上使用了一些排序算法,例如quicksort或mergesort。
好吧,我們需要比較器函子來確定元素的順序。 基本的東西在任何排序算法中,基本的操作都是比較。如果可以指定我們基本上是在控制排序操作。
希望現在您能拼湊起來。 這就是為什么cmp()
會采用兩個值進行比較並基於它們的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.