std::sort 结构向量无效运算符<
std::sort vector of struct invalid operator<
我在 std::sort 的比较函数中遇到 严格弱排序 的问题。我不明白为什么会失败。
我有一些嵌套结构:
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;
}
当 运行 函数和调试时,我传递给 compareDateAndTime()
的第一项在其中一个语句(月)上返回 true 后通过。
下一项 returns 在小时比较时为真,但随后我得到 "Debug Assertion Failed!" 和 "Expression: invalid operator<"。
谷歌搜索,这与严格的弱排序有关。但是为什么在比较 int 变量时会失败?
您的比较函数没有实现严格的弱排序
考虑这种情况:
t1
: 年=2017, 月=2
t2
: 年=2016, 月=5
compareDateAndTime(t1, t2)
会 return 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 的运算符 <,它被定义为执行您期望的操作。
我在 std::sort 的比较函数中遇到 严格弱排序 的问题。我不明白为什么会失败。
我有一些嵌套结构:
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;
}
当 运行 函数和调试时,我传递给 compareDateAndTime()
的第一项在其中一个语句(月)上返回 true 后通过。
下一项 returns 在小时比较时为真,但随后我得到 "Debug Assertion Failed!" 和 "Expression: invalid operator<"。
谷歌搜索,这与严格的弱排序有关。但是为什么在比较 int 变量时会失败?
您的比较函数没有实现严格的弱排序
考虑这种情况:
t1
: 年=2017, 月=2t2
: 年=2016, 月=5
compareDateAndTime(t1, t2)
会 return 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 的运算符 <,它被定义为执行您期望的操作。