【问题标题】:std::map design: why map accept comparator as template parameterstd::map 设计:为什么 map 接受比较器作为模板参数
【发布时间】:2009-03-30 22:14:37
【问题描述】:

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

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

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

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

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

已编辑
很抱歉这个问题,地图有相同的可能性:)
你的回答我的问题没有意义。

【问题讨论】:

    标签: c++ stl boost map


    【解决方案1】:

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

    【讨论】:

    • 好的。我是这个网站的新手,不知道关于奖励的规则。但我怀疑这取决于速度。无论如何,谢谢你的回答。
    【解决方案2】:

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

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

    【讨论】:

    • +1 - 谢谢。但是很抱歉,我接受了 Rob 的回答,因为他比你早。
    • 实际上,Neil 的回答提前了大约 3 分钟,所以如果您将提交时间用作其他同样有用的答案的决胜局,那么请授予此答案的接受。
    【解决方案3】:

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

    【讨论】:

    • 好点,但标准解决方案更好))谢谢你的帮助。
    • 我认为你关于“深层原因”的问题的第二部分是完全有效的,而不是愚蠢的! :) 顺便说一句,std::tr1::function 已经是半标准的了,见en.wikipedia.org/wiki/Technical_Report_1
    【解决方案4】:

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

    【讨论】:

    • '标准库的目标是不低于一个优秀的 C++ 程序员自己生成的效率'——这点也不错。 +1 记住我。
    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多