C++STL系列——深入理解list容器作用原理

本文源码以GNU2.9编译器为例展开说明,同时参考一下GNU4.9的部分源码。

1 list主要源码和数据结构

1.1 GNU2.9源码结构

在这里插入图片描述
在这里插入图片描述

1.2 GNU4.9源码结构

1.2.1 _List_node_base

在这里插入图片描述

1.2.2 _List_node

在这里插入图片描述
因此,一个list<T>实例的size为24个字节(考虑内存对齐)。

2 iterator迭代器

list的迭代器本质上是一个class,单纯从list这种数据结构本身来看,list的遍历不能通过next指针++的方式对list元素进行遍历–list的存储空间为链表,其内存空间不是连续的,因此不能使用next指针++的方式推动指针指向下一个元素,因此需要封装list迭代器iterator为一个class类,使变成一个智能的“指针”,可以通过iterator++就可以实现指向下一个元素(list的iterator迭代器正是通过重载++运算符实现到链表node中找到next指针,以实现++操作)
在这里插入图片描述

2.1 operator++操作符重载

在这里插入图片描述

2.2 operator*操作符重载在这里插入图片描述

2.3 GNU4.9源码结构

在这里插入图片描述
因此,list<T>::iterator实例的size为8个字节。

3 参考材料

  • 侯捷《STL标准库和泛型编程》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值