C++ 适配器到底是个啥概念, 函数适配器,迭代器适配器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 适配器到底是个啥概念, 函数适配器,迭代器适配器相关的知识,希望对你有一定的参考价值。

c++中的适配器有三种:容器适配器,迭代器适配器,函数适配器下面一一介绍


    容器适配器:因为这些容器都是基于其他标准容器实现的所以叫做容器的适配器,具体的有stack,queue,priority_queue,默认的情况下,stack和queue基于deque而实现的,,priority_queue在vector上实现的,可以根据第二个实参指定容器的类型,但一定要符合标准,queue要求要有push_front操作因此不能建立在vector上面,priority_front要求有随机访问的功能,因此建立在vector上面。优先级队列默认采用<排序的>

 2.迭代适配器:插入器是一种迭代器适配器,带有一个容器参数,并生成一个迭代器,提供了三种插入器back_inserter(容器),front_inserter(容器),inserter(容器,位置)

 3.函数适配器,用于扩展一元和二元函数对象,如functor 函数对像等等。用于容器与算法之前的操作时使用。

参考技术A 和数组一样,是数组的替代品,

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源码剖析>>

 

以上是关于C++ 适配器到底是个啥概念, 函数适配器,迭代器适配器的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL应用与实现18: 如何使用迭代器适配器

c++ 迭代器库

SGI-STL简记-适配器(容器迭代器仿函数)

C++:使用迭代器遍历 DBUS 消息以查找 BlueZ 5 适配器

STL标准库-容器适配器

C语言中,变量到底是个啥概念?