zoukankan      html  css  js  c++  java
  • STL标准库-容器适配器

    技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性

    上一节介绍了仿函数适配器,这节主要介绍容器适配器和迭代器适配器的概念,其实容器适配器和迭代器其适配器就是封装了一些其他class的方法,非常好理解.

    如果你想让一个calss拥有另一个class的功能,你都可以这样做:1.继承 2.包含

    迭代器适配器 运用继承方式,实现适配功能,其实现与仿函数适配器相似.

    容器适配器中主要运用的就是包含,即一个类含的一个成员变量是另一个类,本节简单介绍两个容器适配器


    容器适配器

    queue 先进先出

    template<typename _Tp, typename _Sequence = deque<_Tp> >//底层实现为deque
    class queue
        {
          // concept requirements
          typedef typename _Sequence::value_type _Sequence_value_type;
          __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
          __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept)
          __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
          __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
    
      ...
        protected:
          _Sequence c;//包含成员变量deque
      
        public:
      ...
    
          explicit
          queue(const _Sequence& __c)
          : c(__c) { }
    
      ...
    
          bool
          empty() const //queue的函数封装了一个deque的一些函数,产生了自己的独特性质,先进先出
          { return c.empty(); }
    
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
       ...
    }

    stack 先进后出

    template<typename _Tp, typename _Sequence = deque<_Tp> >
        class stack
        {
        ...
        protected:
          //  See queue::c for notes on this name.
          _Sequence c;//底层实现是deque
    
        public:
          // XXX removed old def ctor, added def arg to this one to match 14882
          /**
           *  @brief  Default constructor creates no elements.
           */
    #if __cplusplus < 201103L
          explicit
          stack(const _Sequence& __c = _Sequence())
          : c(__c) { }
    #else
          explicit
          stack(const _Sequence& __c)
          : c(__c) { }
    
          explicit
          stack(_Sequence&& __c = _Sequence())
          : c(std::move(__c)) { }
    #endif
    
          /**
           *  Returns true if the %stack is empty.
           */
          bool
          empty() const
          { return c.empty(); } //封装了deque得方法
    
          /**  Returns the number of elements in the %stack.  */
          size_type
          size() const
          { return c.size(); }
    }

    参考侯捷<<STL源码剖析>>

  • 相关阅读:
    【BZOJ3998】弦论(后缀自动机)
    【BZOJ4566】找相同字符(后缀自动机)
    AtomicInteger在实际项目中的应用
    ElasticSearchserver操作命令
    照猫画虎学gnuplot之折线图
    HDU 5667 :Sequence
    mycat 连续分片 -&gt; 按日期(天)分片
    DM8168 unrecoverable error: OMX_ErrorBadParameter (0x80001005) [resolved]
    多线程(一):初识多线程
    Vb.net/VB 声明API函数实现父窗口功能
  • 原文地址:https://www.cnblogs.com/LearningTheLoad/p/7599709.html
Copyright © 2011-2022 走看看