代码之家  ›  专栏  ›  技术社区  ›  Milan BabuÅ¡kov

std::multimap中的键要求

  •  1
  • Milan BabuÅ¡kov  · 技术社区  · 16 年前

    我有一个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;
    

    现在,我想使用上界和下界来迭代所有具有相同值“s”的元素。是否需要为X实现其他一些运算符(例如:==)。或者它会像这样正常工作?

    另外,我应该提供什么作为论据呢? 上界 下限 ?我想我应该创建一个具有所需值“s”的虚拟对象。

    2 回复  |  直到 16 年前
        1
  •  5
  •   Michael Burr    16 年前

    自从 class X 是multipmap的键,参数为 upper_bound() / lower_bound() 必须是那种类型。如果 类X 具有隐式转换自 std::string (这是 X::s )然后您可以使用它作为 上边界() / LoeRixBoin() .

    多映射的默认比较是 less<> 只需调用 operator <() -所以这是你唯一需要的接线员 类X 让多重映射工作。

        2
  •  0
  •   gbjbaanb    16 年前

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

    上界和下界与任何其他find-type方法一样,因此需要同一类型的对象进行比较-在您的情况下,需要一个值为s的“dummy”对象。

    编辑 :注释是正确的,您只需要运算符<即可进行下/上界查找。但是,如果要调用容器上的其他方法,还需要operator==。如果要对容器进行sort(),则需要operator==。

    所有STL容器需要的2个重载是operator<和operator==。我发现最好的做法是两者都加以实施。

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