【问题标题】:Write C++ container that fits neatly into STL编写适合 STL 的 C++ 容器
【发布时间】:2011-09-12 11:16:26
【问题描述】:

我想以一种非常适合 STL 的风格编写一个容器类。它的外观和行为都应该像标准 STL 容器一样。

是否有手册、报告、问答等描述如何使用这些功能编写代码?这样的文本应该损害 STL 的设计原则、陷阱、编码约定等。

PS:这个问题的部分灵感来自于:C++ vector with dynamic item size,尽管这个想法与模板类无关。

【问题讨论】:

  • 你的容器要做什么?很难想出有用的新方法。
  • @Neil 我能想到几个。有许多特殊用途的容器。或者,作为不在 C++ 和 Boost 中的通用容器的示例:跳过列表。
  • @Konrad 我很难说,并非不可能。我仍然认为编写自己的 STL 兼容容器应该是最后的手段,而不是(在这种情况下似乎)第一次。
  • @Neil,这可能只是一个练习。我认为 OP 通过编写新容器的过程会学到很多东西,即使它在生产代码中不一定有用。

标签: c++ stl reference-manual


【解决方案1】:

这不是很困难(对于简单的数据结构)。你应该阅读 C++ 标准中关于容器的章节。您可以在此处下载即将发布的 C++1x 标准的草案:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/#mailing2011-04

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf

您可能希望在编写迭代器时使用 boost::iterateror_facade。

http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/iterator_facade.html

【讨论】:

  • 确保您准确地支持迭代器要求 - 然后所有 STL 算法都可以正常工作。容器要求不太重要 - 没有太多旨在与许多不同容器一起工作的东西。最好的办法是让您的容器类似于标准容器之一,但不要担心在适当的时候会有所不同。
  • 我不得不说,实际的草案标准是 n3290 (FDIS),它位于密码墙后面。因此,对于没有能力或不愿意为此付费的人来说,它是非常无益的。
  • 你可以得到上一个。 n3290 和例如 n3242 之间的区别对于普通程序员来说可能不是很重要(我不知道最近发生了什么,但我想这可能是次要的编辑细节和/或对语言实现者很重要的事情)。 (有人吗?)我认为您不需要真正权威的 C++1x 标准来实现容器。
【解决方案2】:

我推荐阅读 Herb Sutter 的 "Unstrung"。这是对std::string 的深入了解,涵盖了正确的地方和可以做得更好的地方。我非常重视他对 C++ 编程问题的看法。这是一篇很长的文章,但我保证你会学到一些关于以 C++ 标准库的风格编写类的有用知识(以及关于编写一般类的知识)。

您还可以查看 Scott Meyers 的Effective STL。这本书将为您提供对标准库容器用户的期望的一个很好的概述。拥有这种洞察力将帮助您自己编写更好的容器类。

【讨论】:

    【解决方案3】:

    我推荐阅读 Josuttis,C++ 标准库:教程和参考。它对 STL 背后的原理给出了清晰易读的解释。

    【讨论】:

      【解决方案4】:

      除了 user763305 推荐的那个,我还会看看 Austern,通用编程和 STL:使用和扩展 C++ 标准模板库。它讨论了这些问题,并为 STL 中的概念提供了很好的参考。

      【讨论】:

        猜你喜欢
        • 2011-12-07
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-19
        • 1970-01-01
        相关资源
        最近更新 更多