C++ STL 概述_严丝合缝的合作者们( 二 )

  • 使用for_each 算法。STL提供了大量算法,使用时需要包含 <algorithm>头文件 。
//重新指向容器的开始位置(因为前面的操作移动过迭代器)begin=nums.begin();//使用 for_each 算法组件for_each(begin,end,Zs<int>());
  • 输出结果 。

C++ STL 概述_严丝合缝的合作者们

文章插图
STL使用了高内聚、低耦合的设计理念,各组件的专业能力非常强,合作时又能做到严丝合缝、润物细无声 。
  • 容器专注于数据的存储 。
  • 迭代器专注于容器的访问 。
  • 函数对象提供具体的算法策略 。
  • 算法相当于发动机,提供聚合动力 。
容器是STL的核心(无数据无程序)组件,且类型繁多,下文将简要介绍容器的共性操作 。
2. 容器STL中的容器和数组相似,能够存储数据集,但有其自身的特点:
  • 支持容量的自动增长 。当添加数据时,如果容量不够时,容器会自动分配新的内存 。
  • 容器可以迭代 。
  • 支持数据类型参数(泛型编程) 。
2.1 分类STL中的容器众多,有点乱入花丛渐迷眼的既视感 。一般会按照存储方式对其进行分类:
  • 序列式容器:数据以添加时的顺序进行存储,当然可以对数据排序 。
  • 关联式容器:数据由两部分组成 。
2.1.1 序列式容器序列式容器的存储方案有 2 种:
  • 连续(线性)存储:基于数组的存储方式,数据与数据在内存中是相邻的 。

C++ STL 概述_严丝合缝的合作者们

文章插图
  • 链式(非线性)存储:以节点的方式非线性存储 。数据与数据在内存中并不一定相邻,结点之间通过存储彼此的地址知道对方的位置 。

C++ STL 概述_严丝合缝的合作者们

文章插图
STL中常用到的序列式容器对象:
  • vector:向量,线性存储,类似于数组 。需要包含 <vector>头文件 。
  • list:双向链表,非线性存储 。需要包含 <list>头文件 。
  • slist:单向链表,非线性存储 。需要包含 <slit>头文件 。
  • deque:双向队列 。需要包含<deque>头文件 。
  • stack:栈,先进后出 。需要包含<stack>头文件 。
  • queue:队列,数据先进先出 。需要包含<queue>头文件 。
  • priority_queue:优先级队列 。需要包含<queue>头文件 。
2.1.2 关联式容器关联式容器也有 2 种存储方案:
  • 使用搜索二叉树:容器中的元素依照键值进行排序 。STL是用红黑树实现关联容器,红黑树是一种查找效率很高的平衡搜索二叉树 。

C++ STL 概述_严丝合缝的合作者们

文章插图
  • 使用哈希表:对键值进行哈希算法,然后根据哈希值把数据存储在不同的单元中 。

C++ STL 概述_严丝合缝的合作者们

文章插图
STL中常用的关联容器: