1

我有一个 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_boundlower_bound的参数?我假设我应该创建一个所需值为“s”的虚拟对象?

4

2 回答 2

5

由于class X是多图的键,因此upper_bound()/的参数lower_bound()必须是该类型。如果class X有一个隐式转换std::string(这是 的类型X::s),那么您可以将其用作upper_bound()/的参数lower_bound()

multimap 的默认比较是less<>简单地调用operator <()- 所以这是你需要拥有的唯一运算符才能class X使 multimap 工作。

于 2008-10-18T23:10:39.667 回答
0

您只需要提供运算符 == 和 <。

upper_bound 和 lower_bound 就像任何其他 find-type 方法一样,因此您需要相同类型的对象进行比较 - 在​​您的情况下,需要 s 值的“虚拟”对象。

编辑:评论是正确的,您只需要 operator< 用于 lower/upper_bound,然后找到。但是如果你想在你的容器上调用其他方法,你也需要 operator== 。例如。如果要对容器进行排序(),则需要运算符==。

所有 STL 容器需要的 2 个重载是 operator< 和 operator==。我发现实现它们的最佳实践。

当然,这个问题也可以通过在地图本身中实现一个比较函子来更全面地回答,而不是依赖于对象。这通常是实现在地图上调用 find() 的不同方式的好方法。

于 2008-10-18T23:06:09.350 回答