技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性
上一节介绍了仿函数适配器,这节主要介绍容器适配器和迭代器适配器的概念,其实容器适配器和迭代器其适配器就是封装了一些其他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源码剖析>>