std :: map design:为什么map接受比较器作为模板参数

时间:2009-03-30 22:14:38

标签: c++ stl boost map

STL的地图类型有下一个类型:

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

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

它可以在构造函数中具有更加灵活的界面,例如boost::function< bool, const T&, const T& > 当然,我强调,当STL被设计时,boost不存在,但设计师可以在boost :: function上创建类似的东西。

我相信它有一些深层原因。

EDITED
抱歉虚拟问题,地图有相同的可能性:) 你的回答后,我的问题没有意义。

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

Map DOES有这样的构造函数。来自C ++标准的第23.3.1节:

explicit map(const Compare& comp = Compare(),
const Allocator& = Allocator());

答案 2 :(得分:3)

因为boost::function是多态的,所以不能内联。 STL的设计旨在使编译器最大限度地进行代码内联,这在扩展模板上很容易实现;您也可以轻松决定使用boost::function来提供与std::map的比较,如果您需要它是多态的。

答案 3 :(得分:2)

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