题
我有一个 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 实现一些其他运算符(例如:==)。还是像这样就可以正常工作?
另外,我应该提供什么作为论据 上限 和 下界?我认为我应该创建一个具有所需值“s”的虚拟对象?
解决方案
由于class X
是多图的关键,因此upper_bound()
/ lower_bound()
的参数必须属于该类型。如果std::string
具有X::s
的隐式转换(这是less<>
的类型),那么您可以将其用作operator <()
/ <=>的参数。
multimap的默认比较是<=>,它只是调用<=> - 因此这是您需要在<=>中使多地图工作的唯一操作符。
其他提示
您只需要提供运算符 == 和 <。
upper_bound 和 lower_bound 就像任何其他查找类型方法一样,因此您需要相同类型的对象进行比较 - 在您的情况下,是具有所需 s 值的“虚拟”对象。
编辑:注释是正确的,您只需要operator< 来表示下限/上限,然后查找。但是如果你想在容器上调用其他方法,你还需要operator==。例如。如果你想对你的容器进行排序,你将需要operator==。
所有 STL 容器所需的 2 个重载是operator< 和operator==。我发现实现它们的最佳实践。
当然,也可以通过在映射本身中实现比较函子而不依赖于对象来更全面地回答这个问题。这通常是实现在地图上调用 find() 的不同方式的好方法。
不隶属于 StackOverflow