代码之家  ›  专栏  ›  技术社区  ›  bayda

std::map design:为什么map接受comparator作为模板参数

  •  0
  • bayda  · 技术社区  · 15 年前

    STL中的映射类型具有下一个类型:

    std::map< Key, Data, Compare, Alloc >
    

    作为模板参数之一,我们可以传递 Compare 谓词,为什么map接受这个谓词作为模板参数而不是构造函数中的对象?

    它可以有更灵活的界面 boost::function< bool, const T&, const T& > 在构造函数中。
    当然,我低估了当设计STL时,Boost并不存在,但是设计人员可以在Boost::函数上创建类似的东西。

    我认为这有一些深层次的原因。

    编辑
    抱歉,这个虚拟问题,map的位置相同:)
    你回答完后我的问题就没有意义了。

    4 回复  |  直到 15 年前
        1
  •  5
  •   anon    15 年前

    map确实有这样的构造函数。从C++标准的第23.3.1节开始:

    explicit map(const Compare& comp = Compare(),
    const Allocator& = Allocator());
    
        2
  •  7
  •   Rob Kennedy dkackman    15 年前

    模板参数是 类型 谓词的,而不是值的。价值 可以 作为构造函数的参数提供。可以指定与类型匹配的任何值。如前所述,默认类型为 std::less<Key> ,它几乎只有一个值,但是您应该能够为 Compare 论点,包括 boost::function ,然后使用各种值控制地图对象的行为。

        3
  •  3
  •   Daniel Earwicker    15 年前

    因为 boost::function 是多态的,不能内联。STL的设计是为了让编译器尽可能地嵌入代码,这在扩展的模板上很容易实现;而且您也可以很容易地做出使用的决定。 Boo::函数 提供与 std::map 如果你需要它是多态的。

        4
  •  2
  •   Mark Ransom    15 年前

    使用比较对象会创建运行时成本-需要存储该对象,并且必须通过指针进行比较。通过使用类,比较可以简化为单个表达式,例如在使用int键时。标准库的目标是不比一个好的C++程序员自己生成的效率低。