std :: struct vector of struct invalid operator<

时间:2017-12-02 16:04:32

标签: c++ sorting strict-weak-ordering

我在std :: sort的compare函数中遇到严格弱排序的问题。我不明白为什么会失败。

我有一些嵌套结构:

HashMap<Integer, Seat>

在我的代码中,我有一个填充的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);
}

在运行函数和debuging时,我的第一个项目传递给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; } 后,在其中一个语句(月份)上返回true。 下一个项目在小时比较时返回true,但后来我得到一个“Debug Assertion Failed!” “表达式:无效的运算符&lt;”。

进行一些谷歌搜索,这与严格弱排序有关。但是为什么在比较int变量时这会失败?

2 个答案:

答案 0 :(得分:2)

您的比较函数未实现严格的弱排序

考虑这种情况:

  • "use strict"; function processCookie() { document.cookie = "username=" +document.getElementById('usernameinput').value; } function populateInfo() { if (document.cookie) { var uname = document.cookie; uname = uname.substring(uname.lastIndexOf("=") + 1); document.getElementById('usernameinput').value = uname; } } function handleSubmit(evt) { if (evt.preventDefault) { evt.preventDefault(); } else { evt.returnValue = false; } processCookie(); document.getElementsByTagName('form')[0].submit(); } function createEventListener() { var loginForm = document.getElementsByTagName('form')[0]; if (loginForm.addEventListener) { loginForm.addEventListener("submit", handleSubmit, false); } else if (loginForm.attachEvent) { loginForm.attachEvent("onsubmit", handleSubmit); } } function setUpPage() { populateInfo(); createEventListener(); } if (window.addEventListener) { window.addEventListener("load", setUpPage, false); } else if (window.attachEvent) { window.attachEvent("onload", setUpPage); } :年= 2017年,月= 2
  • t1:年= 2016年,月= 5

t2会返回compareDateAndTime(t1, t2)

当且仅当true相同时,您才应继续比较month

year

......等等......

答案 1 :(得分:1)

利用标准库的好方法:

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的运算符&lt;,它被定义为执行您期望的操作。