我正在尝试为具有自定义键的C ++映射编写自定义比较器。
struct key { int year; int no; };
map<key, detail, compare> details_map;
如果year
的值相等,则必须比较no
的值。
我正在尝试找到一种方法来编写一个可以比较两个值的比较器。到目前为止,我只能编写一个比较一个值的比较器。
struct Compare{bool operator()(const key &lhs,const key &rhs)const{return lhs.year<rhs.year;}}
有人可以解释比较器在map
中如何工作吗?
还可以将比较器作为函数编写吗?
答案 0 :(得分:5)
在operator()
内,如果no
的值相等,则只需比较year
的值:
struct Compare {
bool operator()(const key &lhs, const key &rhs) const {
if (lhs.year == rhs.year) {
return lhs.no < rhs.no;
}
return lhs.year < rhs.year;
}
};
是的,可以将比较器实现为独立功能:
bool Compare (const key &lhs, const key &rhs) {
if (lhs.year == rhs.year) {
return lhs.no < rhs.no;
}
return lhs.year < rhs.year;
}
或者,您可以让比较器使用std::tie()
来比较您的关键字段。参见@ Jarod42的答案。
不过,改为为您的operator<
类型实现key
更有意义:
struct key {
int year;
int no;
bool operator<(const key &rhs) const {
if (year == rhs.year) {
return no < rhs.no;
}
return year < rhs.year;
}
};
或
struct key {
int year;
int no;
};
bool operator<(const key &lhs, const key &rhs) {
if (lhs.year == rhs.year) {
return lhs.no < rhs.no;
}
return lhs.year < rhs.year;
}
然后,您不需要单独的比较器:
map<key, detail> details_map;
答案 1 :(得分:2)
std::tie
允许简单的字典比较:
struct Compare {
bool operator()(const key& lhs, const key& rhs) const {
return std::tie(lhs.year, lhs.no) < std::tie(rhs.year, rhs.no);
}
};
方法/功能as_tuple
可能很有趣,可以避免某些重复:
struct key { int year; int no; };
auto as_tuple(const key& k) { return std::tie(k.year, k.no); }
struct Compare {
bool operator()(const key& lhs, const key& rhs) const {
return as_tuple(lhs) < as_tuple(rhs);
}
};