簡體   English   中英

std :: struct vector of invalid invalid operator

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

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