STL的地图类型有下一个类型:
std::map< Key, Data, Compare, Alloc >
作为模板参数之一,我们可以传递Compare
谓词,为什么map接受这个谓词作为模板参数而不是构造函数中的对象?
它可以在构造函数中具有更加灵活的界面,例如boost::function< bool, const T&, const T& >
当然,我强调,当STL被设计时,boost不存在,但设计师可以在boost :: function上创建类似的东西。
我相信它有一些深层原因。
EDITED
抱歉虚拟问题,地图有相同的可能性:)
你的回答后,我的问题没有意义。
答案 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 ++程序员自己生成的目标。