本篇文章介绍一下c++11中新增的顺序容器forward_list
,基于stl的源码分析一下该容器的整体实现及数据结构。
说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。
按照惯例,还是先看一下本文大纲,如下:
1. forward_list是什么
forward_list是c++11为STL新增加的一种顺序容器,使用的时候包含头文件forward_list
即可,真实的类声明位于头文件bits/forward_list.h
中,类forward_list
是一个类模板,基于单链表结构实现,下面我们就来基于forward_list
的源码来看下它的具体实现。
2. forward_list周边类介绍
在正式开始介绍类模板forward_list
之前,我们先了解下它所使用到的其他类型的介绍,这些类型是理解forward_list
源码实现的前置条件。
2.1 类模板_Fwd_list_node
和它的基类_Fwd_list_node_base
类模板_Fwd_list_node
声明同样位于头文件bits/forward_list.h
中,先看下类声明,如下:
template<typename _Tp>
struct _Fwd_list_node
: public _Fwd_list_node_base
{
_Fwd_list_node() = default;
__gnu_cxx::__aligned_buffer<_Tp> _M_storage;
_Tp*
_M_valptr() noexcept
{
return _M_storage._M_ptr(); }
const _Tp*
_M_valptr() const noexcept
{
return _M_storage._M_ptr(); }
};
该类定义了一个成员变量_M_storage
,这个成员变量类型是__gnu_cxx::__aligned_buffer<_Tp>
,同样是一个类模板,看看类模板__aligned_buffer
的类声明,如下:
template<typename _Tp>
struct __aligned_buffer
: std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>
{
typename
std