【问题标题】:Is there a readable implementation of the STL? [closed]是否有 STL 的可读实现? [关闭]
【发布时间】:2010-01-24 15:51:30
【问题描述】:

我在 Linux 上;查看 STL 标头;它们真的很复杂。

是否存在具有 STL 核心功能但实际上可读的较小版本的 STL?

谢谢!

【问题讨论】:

  • 我正在编写自己的一些模板。我想了解如何实施 STL 以从他们的权衡中学习。
  • @jalf » 出于教育目的,在幕后偷看通常是值得的。并非黑盒子内的每一次查看都是出于偷偷摸摸的封装破坏的原因。 :)
  • @John:但大多数都是。无论如何,可以从中学到的东西很少。 STL 代码的设计目的不是 1) 好,或 2) 可移植。它通常是为特定的编译器和平台设计的,这意味着它可以摆脱您自己的代码应该依赖的所有特定于实现的技巧。可以从 STL 中学习很多东西,但您可以从界面、文档和底层设计中学习,而不是实现。
  • @280Z28 没有“STL的实现”。
  • @280Z28:我们不要走神。 OP 想将他的 STL 实现作为学习练习来阅读。因此,就this 问题而言,阅读和理解STL 实现不是 副作用。除此之外,您不太可能通过阅读源代码来了解“为什么”。再次以我上面的例子为例,阅读源代码只会告诉你“如何”:(模板类型应该以下划线开头,后跟大写字母),但它没有告诉你 why:(因为那些名称是为实现保留的,因此我们不会冒险与用户定义的名称发生冲突)

标签: c++ stl


【解决方案1】:

有一本书C++ 标准模板库,由最初的 STL 设计师 Stepanov & Lee(与 P.J. Plauger 和 David Musser 一起)合着,描述了一种可能的实现,并附有代码- 见http://www.amazon.co.uk/C-Standard-Template-Library/dp/0134376331

【讨论】:

    【解决方案2】:

    是的,Alexander Stepanov 和 Meng Lee 最初实现了 STL。这是我见过的最易读的 STL 实现。可以from here下载。

    下面是pair的实现。请注意源代码的可读性:

    #include <bool.h>
    
    template <class T1, class T2>
    struct pair {
        T1 first;
        T2 second;
        pair() {}
        pair(const T1& a, const T2& b) : first(a), second(b) {}
    };
    
    template <class T1, class T2>
    inline bool operator==(const pair<T1, T2>& x, const pair<T1, T2>& y) { 
        return x.first == y.first && x.second == y.second; 
    }
    
    template <class T1, class T2>
    inline bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y) { 
        return x.first < y.first || (!(y.first < x.first) && x.second < y.second); 
    }
    
    template <class T1, class T2>
    inline pair<T1, T2> make_pair(const T1& x, const T2& y) {
        return pair<T1, T2>(x, y);
    }
    

    回归本源!

    【讨论】:

    • 太糟糕了,这个版本不关心我们的std::bad_alloc,只会让内存泄漏。
    • @StaceyGirl 你能详细说明一下吗?
    • @piepi 我在谈论这篇文章中提到的 STL 实现。看看vector&lt;T&gt;::reserve是如何实现的。有些被复制的元素可能会引发异常,在这种情况下分配的内存块将不会被释放。
    【解决方案3】:

    我使用The C++ Standard Library: A Tutorial and Reference 并强烈推荐它。当然,这不是你从头到尾阅读的东西,而是一个非常方便的参考。也可以查看亚马逊上的评论。

    【讨论】:

    • 一本很棒的书,但没有解决问题。
    【解决方案4】:

    请注意,GCC 的 STL 标头将制表位设置为 8。重新配置您的编辑器或用八个空格替换选项卡,它应该更具可读性。

    【讨论】:

      【解决方案5】:

      突出两个关键点:

      1. 如果不了解语言本身的目标、原理、优点和限制以及一般方法,则任何 STL 实现都是可读的。
      2. 一旦您对 (1) 有了深入的了解,大多数实现都是可读的,因为代码在这些前提下是自记录的。您可能不喜欢 格式,但这确实应该是您遇到的最少问题。

      附带说明一下,您可能在使用 MSVC 版本时会取得更大的成功,因为它不会尝试以 multiple 那么多编译器为目标。编译器错误和实现定义的行为会导致各种微妙的解决方法。随着这些变通方法数量的增加(当您添加更多编译器时肯定会发生这种情况),代码可能会很快变得粗糙。

      【讨论】:

        【解决方案6】:

        RDESTL 提供了“STL 功能的一小部分”(但也有一些附加功能)。 我个人发现代码比 STLPort 或 VC++ 附带的 Dinkumware 实现等大公司更具指导性且更易于导航。

        【讨论】:

          【解决方案7】:

          有关 STL 的“规则”(例如迭代器)的最新和更全面的解释,请查看 Stepanov 合着的新书:http://www.elementsofprogramming.com/

          如果你喜欢数学,这本书会让你兴奋不已,因为作者所描述的本质上是一个计算代数。该网站包含一个示例章节。

          【讨论】:

            【解决方案8】:

            嗯,STL 相当复杂,所以我认为这里存在一定程度的基本复杂性。乍一看可能有点令人困惑,这并不奇怪。

            也就是说,也许你可以看看 Borland 的 STLport,看看你是否觉得它更容易阅读。

            【讨论】:

            • 注意,STLport 不是 Borland 的产品。 STLport 是基于原始 SGI STL 版本的实现。 Borland 刚刚在 BCB6 中切换到 STLport,但它不维护或拥有 STLport 项目。
            【解决方案9】:

            STL 是一个高度优化的库,它通过巧妙地利用 C++ 和底层编译器的高级特性来完成大部分工作。此外,很多东西都是内联的,所以在应用程序中没有真正的代码。我建议听从 Neil 的建议。

            【讨论】:

              猜你喜欢
              • 2014-10-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-30
              • 1970-01-01
              • 1970-01-01
              • 2012-01-15
              相关资源
              最近更新 更多