C++学习笔记 深度剖析list

1、容器list

当你对某个type实施operator->,而该type并非built-in ptr时,编译器会做一件很有趣的事,在找出user-defined operator->并将它施行于该type后,编译器会对执行结果再次施行operator->。编译器不断执行这些动作直至触及a pointer to built-in type,然后才进行成员存取。

2、list的iterator --- list的迭代器

以operator++操作符为例。

(1)前++

self& operator++() { node = (link_type)((*node).next); return *this; }

return by reference,通过引用返回,因此不会引起操作符重载。

(2)后++

self operator++(int) { self tmp = *this; ++*this; return tmp; }

 1> 记录原值 self tmp = *this;

此步不会引起operator*操作,因为先考虑的是=,即赋值操作,因此做的是拷贝构造操作。

2> 进行操作 ++*this,不会引起operator*操作,即++*this调用的是operator++()操作。

3> 返回原值,也调用的是拷贝构造函数,将值返回。

那么现在存在一个问题,为什么前++返回的是引用,而后++返回的是值类型呢?而且后++的操作符重载有一个int参数?

1> 后++的操作符重载有一个int参数,C++语法规定,为了区分前++与后++操作符重载的区别,因此在后++操作符参数多一个int类型的参数以标识区别。

2>为什么前++返回的是引用,而后++返回的是值类型呢?

这个功能我们所根据int类型的前++与后++所仿写的。

int i = 6;

++++i;  -> ++(++)i;  

i++++; -> (i++)++; // 这个是行不通的

因此list容器的++操作符重载也采用仿int类型的操作,前++可以多次++,即返回值采用引用,而后++不可以多次++,即返回值采用值返回。

2.9版本-》4.9版本

  

list继承于_List_base,_List_base里有一个_List_impl,_List_impl继承于_A<_List_node>,_List_impl有一个_List_node_base,_List_node继承于_List_node_base。

2、Iterator设计需要遵循的原则

Iterator必须提供的5种associated types

typedef bidirectional_iterator_tag     iterator_category;
typedef _Tp                            value_type;
typedef _Tp*                           pointer;
typedef _Tp&                           reference;
typedef ptrdiff_t                      difference_type;

value_type的主要目的是用来声明变量,而声明一个无法被赋值的变量没什么用,所以iterator(即便是constant iterator)的value_type不应加上const,iterator若是const int,其value_type应该是int,而非const int。

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值