我有一个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”值的虚拟对象?
答案 0 :(得分:5)
由于class X
是多图的关键,因此upper_bound()
/ lower_bound()
的参数必须属于该类型。如果class X
具有std::string
的隐式转化(X::s
的类型),那么您可以将其用作upper_bound()
/ lower_bound()
的参数。< / p>
多图的默认比较为less<>
,只需调用operator <()
- 因此,您需要在class X
中使用多个地图才能运行。
答案 1 :(得分:0)
你只需要提供一个运算符==和&lt;。
upper_bound和lower_bound与任何其他find-type方法一样,因此您需要使用相同类型的对象进行比较 - 在您的情况下,需要具有所需值s的“虚拟”对象。
修改:评论是正确的,您只需要运营商&lt;对于lower / upper_bound,并查找。但是如果你想在容器上调用其他方法,你也需要operator ==。例如。如果你想对容器进行排序(),则需要operator ==。
所有STL容器所需的2个重载是运算符&lt;和运算符==。我找到了最佳实践来实现它们。
当然,通过在地图中实现比较仿函数而不依赖于对象,也可以更充分地回答这个问题。这通常是在地图上实现调用find()的不同方法的好方法。