《STL》读书笔记

简介

C++ STL 实现三类数据结构标准容器类 的实现:  

顺序性容器 
vector 从后面快速的插入与删除,直接访问任何元素 
deque 从前面或后面快速的插入与删除,直接访问任何元素 
list  双链表,从任何地方快速插入与删除 
 关联容器  
set 快速查找,不允许重复值 
multiset 快速查找,允许重复值 
map 一对多映射,基于关键字快速查找,不允许重复值 
multimap 一对多映射,基于关键字快速查找,允许重复值 
 容器适配器 
stack 后进先出 
queue 先进先出 
priority_queue 最高优先级元素总是第一个出列 

迭代器

iterator定义。

  1. template<class _Category,  
  2.     class _Ty,  
  3.     class _Diff = ptrdiff_t,  
  4.     class _Pointer = _Ty *,  
  5.     class _Reference = _Ty&>  
  6.         struct iterator  
  7.             : public _Iterator_base_universal  
  8.   
  9.   
  10.     {   // base type for all iterator classes  
  11.     typedef _Category iterator_category;  
  12.     typedef _Ty value_type;  
  13.     typedef _Diff difference_type;  
  14.     typedef _Diff distance_type;    // retained  
  15.     typedef _Pointer pointer;  
  16.     typedef _Reference reference;  
  17.     };  

迭代器的五种类型

 分别由五个空的结构体来标识(只是巧妙的应用于参与重载函数中参数的解析)。

(1)输出迭代器。  用于存取有序序列的元素,即不能从容器中把元素读出来。

  •   *next=<whatever> ,即定义了赋值操作符,同时复制构造函数也是必要的;
  • ++next 改变next为指向序列中的下一个元素。
范例: while(<not done>)
                  *next++ = <whatever>;
(2) 输入迭代器 。 用于产生新的序列,即不能写元素到容器中。
  •  当两个类型为X的迭代器p和q没有同时指向一个元素时,p!=q为真。即定义了==(!=的相反)操作符。
  • *p是类型T的右值
  • ++next 改变next为指向序列中的下一个元素。
范例: for(p=first; p!=last; ++p)
               <process>(*p);
(3) 前向迭代器 。 可读可写
输出迭代器+输入迭代器。
(4) 双向迭代器 。  同时支持递增和递减操作。
  • 前向迭代器的特性;
  •  --pre改变pre为提向链表的前一项。
(5)随机迭代器。 支持与整型值的加减操作,迭代器间的相减和比较操作,下标操作。
  • 双向迭代器特性;
  • 定义了比较操作符<(>, <=, >=);
  • 定义了与整型的加减操作符;
  • 定义了[ ]操作符。
  • ++next 改变next为指向序列中的下一个元素。
        如vector::iterator

vector

基础

以连续数组方式存储。

支持随机迭代器。

属性

al; //分配器

pointer pFirst; //所控列表的开始位置指针

pointer pLast; //所控列表的结束位置的下一指针

pointer pEnd; //当前已配数组的结束位置的下一指针

适用性

vector适用于需要快速地随机存取被控元素。

basic_string与vector的选择

 1》basic_string的元素只能拥有默认构造函数和析构函数,而vector不限定构造函数和析构函数,另需赋值操作符。

2》basic_string可以移交以NULL结尾的序列,vector只处理我们存储在它里面的序列。

3》basic_string使用写时复制?来优化。

list

基础

双链表方式存储。

只能以连续方式对元素进行存取,线性复杂度

支持双向迭代器

所有的容器中只有list保证在异常出现时回退到操作前的状态?

属性

_Alty _Alval; // 结点分配器

_Nodeptr _Myhead; // 虚拟头结点指针,向前移动则指向序列开始处,向后移动则指向其末端
size_type _Mysize; // 结点数

适用性

list适用于重排序列操作(插入,删除,替换)。

   不适用于元素定位操作(查找,随机存取);额外开销:前向和后向指针。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值