C++_泛型编程与标准库(八)
参考:《侯捷泛化编程与标准库》、GNU9.3.0,vs2019
图中标红部分为自己的笔记理解
1、array
GNU 2.9的写法
array GNU9.3.0部分源码
array没有ctor,没有dtor,包括vs2019也是
template<typename _Tp, std::size_t _Nm>
struct __array_traits
{
typedef _Tp _Type[_Nm];//_Type为数组名类型,通过其定义出来就是一个数组的数组名
typedef __is_swappable<_Tp> _Is_swappable;
typedef __is_nothrow_swappable<_Tp> _Is_nothrow_swappable;
static constexpr _Tp&
_S_ref(const _Type& __t, std::size_t __n) noexcept
{ return const_cast<_Tp&>(__t[__n]); }
static constexpr _Tp*
_S_ptr(const _Type& __t) noexcept
{ return const_cast<_Tp*>(__t); }
};
template<typename _Tp, std::size_t _Nm>
struct array
{
typedef _Tp value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef value_type* iterator;
typedef const value_type* const_iterator;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
// Support for zero-sized arrays mandatory.
typedef _GLIBCXX_STD_C::__array_traits<_Tp, _Nm> _AT_Type;
typename _AT_Type::_Type _M_elems;//注意这两行很重要,加深typename的用法
....
}
GNU9.3.0内部定义数组的方法是
typename _AT_Type::_Type
,泛型编程typename
经常用到,一定要理解其含义,意思是告诉编译器,标明_AT_Type::_Type
是一种类型typename _AT_Type::_Type _M_elems;
,_M_elems
是被定义的数组头指针,同时也是数组名,可以通过以下代码观察
vs2019相对于GNU,array的内部实现要简单许多,vs2019直接在类的尾部定义了一个数组
2、deque
在此处可以看出GNU9.3.0版本buffersize也没有变化,当缓冲区不够时,双倍扩充内存,并将数据拷贝到新内存的中段
3、queue、stack调用的是deque进行改装
GNU9.3.0的queue与stack
vs2019的queue与stack
选用其他容器做底层