0

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

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

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

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

我相信它有一些深刻的原因。

已编辑
抱歉,您提出了虚拟问题,地图具有相同的可能性:)
在您回答后我的问题没有意义。

4

4 回答 4

7

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

于 2009-03-30T22:23:42.787 回答
5

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

explicit map(const Compare& comp = Compare(),
const Allocator& = Allocator());
于 2009-03-30T22:20:51.013 回答
3

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

于 2009-03-30T22:20:02.170 回答
2

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

于 2009-03-30T22:24:20.523 回答