![](/img/trans.png)
[英]Overloading operator= for struct members of class std::vector<>
[英]std::sort vector of struct invalid operator<
我在std :: sort中的compare函數中遇到嚴格的弱排序問題。 我不明白為什么會失敗。
我有一些嵌套的結構:
struct date{
int day = 1;
int month = 1;
int year = 2017;
};
struct hhmmss{
int hours = 1;
int minutes = 1;
int seconds = 1;
};
struct dateAndTime {
date d;
hhmmss t;
};
struct Trade
{
/*
other unrelevant data
*/
dateAndTime timeClosed;
};
在我的代碼中,在某些時候我有一個填充的std::vector<Trade>
我想要排序。
我的排序功能:
void sortTradesByDate(std::vector<Trade>& trades){
std::sort(trades.begin(), trades.end(), compareDateAndTime);
}
我的比較功能:
bool compareDateAndTime(const Trade& t1, const Trade& t2){
if (t1.timeClosed.d.year < t2.timeClosed.d.year)
return true;
else if (t1.timeClosed.d.month < t2.timeClosed.d.month)
return true;
else if (t1.timeClosed.d.day < t2.timeClosed.d.day)
return true;
else if (t1.timeClosed.t.hours < t2.timeClosed.t.hours)
return true;
else if (t1.timeClosed.t.minutes < t2.timeClosed.t.minutes)
return true;
else if (t1.timeClosed.t.seconds < t2.timeClosed.t.seconds)
return true;
return false;
}
當運行函數和debuging時,傳遞給compareDateAndTime()
第一個項在其中一個語句(月)上返回true后傳遞。 下一個項目在小時比較時返回true,但后來我得到一個“Debug Assertion Failed!” 使用“表達式:無效的運算符<”。
做一些谷歌搜索,這與嚴格的弱排序有關 。 但是為什么在比較int變量時這會失敗?
您的比較函數沒有實現嚴格的弱排序
考慮這種情況:
t1
:年= 2017年,月= 2 t2
:年= 2016年,月= 5 compareDateAndTime(t1, t2)
將返回true
。
當且僅當year
相同時,您應該繼續比較month
。
if (t1.timeClosed.d.year < t2.timeClosed.d.year)
return true;
if (t1.timeClosed.d.year > t2.timeClosed.d.year)
return false;
if (t1.timeClosed.d.month < t2.timeClosed.d.month)
return true;
if (t1.timeClosed.d.month > t2.timeClosed.d.month)
return false;
......等等......
利用標准庫的好方法:
return std::tie(t1.timeClosed.d.year, t1.timeClosed.d.month) < std::tie(t2.timeClosed.d.year, t2.timeClosed.d.month);
你可以在std :: tie中添加缺少的成員(它是一個可變參數模板)。 這使用了std :: tuple的operator <,它被定義為執行您期望的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.