【问题标题】:Can I use an stl map if I plan to use arbitrary class objects as the key?如果我打算使用任意类对象作为键,我可以使用 stl map 吗?
【发布时间】:2010-11-25 17:15:00
【问题描述】:

我是 STL 的新手。关于使用地图存储任意对象的事情让我很困惑:

std::map<MyClassObj, MyDataObject> MyMap;

是我找到对象的方式。例如,MyMap.find (MyClassObjInstance) 如何工作?我是否需要实现自己的迭代器并提供一些标准函数,其中包括一些等价函数?任何示例将不胜感激。

是否有另一种方法可以使用标准库存储任意对象的关联列表?我已经在使用 stl 来维护平台可移植性,并且不希望添加另一个库依赖项,例如 BOOST。

【问题讨论】:

    标签: c++ stl associative-array


    【解决方案1】:

    std::map 在 key 和 value 之后有第三个模板参数,表示将使用什么函数来比较键。默认情况下,它是std::less,而它又使用operator&lt;。所以如果你的类有operator

    【讨论】:

    • 哇,我的眼睛刚刚掠过第三个参数!我想我太习惯于看到带有一堆我通常不关心的参数的重载函数文档。谢谢!
    • :) 我很方便地忘记提及第四个参数 - 分配器。我从未见过它使用过。
    • @Xtofl:我曾经不得不使用分配器,因为 XP 的服务包极大地改变了释放已在堆上分配的数百个整数的性能。
    【解决方案2】:

    您只需为MyClassObj 定义operator&lt;。有关 std::map 的更多信息,您可以阅读here

    根据 C++ 标准 23.1.2:

    短语“键等价”是指比较强加的等价关系,而不是 操作员== 键。也就是说,如果用于比较,则认为两个键 k1 和 k2 是等效的 对象 comp, comp(k1, k2) == false && comp(k2, k1) == false。

    默认情况下compstd::less

    根据 C++ 标准 20.3.3:

    template <class T> struct less : binary_function<T,T,bool> {
    bool operator()(const T& x, const T& y) const;
    };
    
    // operator() returns x < y.
    

    当然,您可以定义独立仿函数 comp 进行比较。

    【讨论】:

    • 这是我希望的答案类型,只是在所有文档中都找不到。这是在哪里记录的?
    • 大部分时间我看一下 www.sgi.com/tech/stl
    • 错字:operator&gt; 当你的意思是operator&lt; 在第一行。
    • 是的,一开始就在那里。复制粘贴杀死我。
    • 总是像标准的sn-p! +1
    【解决方案3】:

    地图的完整类型是

    template < class Key, class T, class Compare = less<Key>,
           class Allocator = allocator<pair<const Key,T> > > class map;
    

    它默认使用小于,但只要你传入一个重载了 operator () 的类以获取对象的两个实例并返回一个 bool,一切都很好。请注意,如果你给它 comp(a,b) 并且它返回 true,那么 a 应该在排序中排在 b 之前。

    【讨论】:

      【解决方案4】:

      是的,您可以使用自己的类型/对象作为键。他们必须实现小于运算符 (operator

      【讨论】:

        猜你喜欢
        • 2015-08-11
        • 2017-07-29
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        相关资源
        最近更新 更多