我在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变量时这会失败?
答案 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;,它被定义为执行您期望的操作。