[英]Requirement for key in std::multimap
我有一个std :: multimap,其中key是一个自定义类。 像这样:
Class X {
public:
std::string s;
int x;
operator <(const X& other) const { return s < other.s; }
};
std::multimap<X, int> mymap;
现在,我想使用upper_bound和lower_bound遍历具有相同“ s”值的所有元素。 我是否需要为X实现其他运算符(例如:==)。 还是像这样正常工作?
另外,我应该提供什么作为upper_bound和lower_bound的参数? 我假设我应该创建一个具有“ s”的期望值的虚拟对象?
由于class X
是多图的键,因此upper_bound()
/ lower_bound()
的参数必须是该类型。 如果class X
从std::string
(这是X::s
的类型)进行隐式转换,则可以将其用作upper_bound()
/ lower_bound()
的参数。
多图的默认比较是less<>
,它简单地调用operator <()
-因此,这是您需要在class X
拥有的唯一运算符,该多图才能起作用。
您只需要提供一个运算符==和<。
upper_bound和lower_bound就像其他任何find-type方法一样,因此您需要使用相同类型的对象进行比较-在您的情况下,是一个具有s所需值的“虚拟”对象。
编辑 :注释是正确的,您只需要operator <来表示lower / upper_bound,然后查找。 但是,如果要在容器上调用其他方法,则也将需要operator ==。 例如。 如果要对容器进行sort(),则需要operator ==。
所有STL容器所需的2个重载是operator <和operator ==。 我发现实现这两者的最佳实践。
当然,也可以通过在地图本身中实现比较函子而不依赖于对象来更全面地回答该问题。 这通常是实现在地图上调用find()的不同方式的好方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.