C++ STL 的简单介绍
本篇文章内容基本来源于C语言中文网,根据其内容进行简化 ,留作自我复习使用 。
一、总体概念
C++ 的标准模板库(Standard Template Library)是泛型程序设计最成功应用的实例 。STL是一些常用数据结构和算法的模板的集合 。
二、STL容器(container)
1 . 基本概念
- 容器用于存放数据的类模板 。
- 将容器类模板实例化为容器类时 ,应指明容器中存放的元素是什么类型 。
- 容器中可存放基本类型的变量 ,也可存放对象 。
2 . 分类
顺序容器
- 特点 :容器内的元素不是排序的 。将元素插入容器时 ,指定在什么位置(尾部、头部或中间某处)插入 ,元素就会位于什么位置 。
- 举例 :动态数组
vector、双向队列deque、单链表forward_list、双链表list关联容器
- 特点 :容器内的元素是排序的 。默认情况下 ,关联容器中的元素是从小到大排序(或按关键字从小到大排序)的 ,而且用<运算符比较元素或关键字大小 。
- 举例 :集合
set、映射map、可有重复元素的集合multiset、可有多个元素关键字相同的映射multimap容器适配器(也简称容器)
- 来源 :它们都是在顺序容器的基础上实现的 ,屏蔽了顺序容器的一部分功能 ,突出或增加了另外一些功能 。
- 举例 :栈
stack、队列queue、优先队列priority_queue
3.相关操作
运算符操作
任何两个容器对象,只要它们的类型相同,就可以用
<、<=、>、>=、==、!=进行词典式的比较运算。成员函数
所有容器都有以下两个成员函数 :
size():返回容器对象中元素的个数 。(返回值为 int 型)empty():判断容器对象是否为空 。(返回值为 bool 型)顺序容器和关联容器还有以下成员函数 :
begin():返回指向容器中第一个元素的迭代器 。end():返回指向容器中最后一个元素下一个位置的迭代器 。rbegin():返回指向容器中最后一个元素的反向迭代器 。rend():返回指向容器中第一个元素前一个位置的反向迭代器 。erase(...):从容器中删除一个或几个元素 。clear():从容器中删除所有元素 。
注 :如果一个容器是空的 ,则
begin()和end()的返回值相等,rbegin()和rend()的返回值也相等 。顺序容器还有以下常用成员函数 :
front():返回容器中第一个元素的引用 。back():返回容器中最后一个元素的引用 。push_back():在容器末尾增加新元素 。pop_back():删除容器末尾的元素 。insert(...):插入一个或多个元素 。
三、STL迭代器(iterator)
1 . 基本概念
- 通过迭代器(iterator)访问顺序容器和关联容器中的元素 。
- 迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。
- 迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。
2 . 定义方法(按定义分类)
- 正向迭代器 :
容器类名::iterator 迭代器名;- 常量正向迭代器 :
容器类名::const_iterator 迭代器名;- 反向迭代器 :
容器类名::reverse_iterator 迭代器名;- 常量反向迭代器 :
容器类名::const_reverse_iterator 迭代器名;
3 . 使用方法
- 通过迭代器可以读取它指向的元素,
*迭代器名就表示迭代器指向的元素。- 通过非常量迭代器还能修改其指向的元素 。
程序示例 :
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> v; //定义一个动态数组 v
for(int i=0;i<5;i++){
v.push_back(i);
}
vector<int>::iterator X; //定义一个 vector 的迭代器 X
for(X=v.begin();X!=v.end();++X){
cout<<*X<<endl;
}
return 0;
}
使用注意事项 :
- 对正向迭代器进行
++操作时,迭代器会指向容器中的后一个元素 ;
对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素 。- 写
++X比写X++的执行速度更快 。- 容器适配器
stack、queue和priority_queue没有迭代器。容器适配器有一些成员函数,可以用来对元素进行访问 。
4 . 迭代器按功能分类
不同容器的迭代器,其功能强弱有所不同。容器的迭代器的功能强弱,决定了该容器是否支持 STL 中的某种算法 。
- 正向迭代器 :支持以下操作 :
++p,p++,*p。- 双向迭代器 :具有正向迭代器的全部功能 。除此之外 ,若
X是一个双向迭代器,则--X和X--都是有定义的。--X使得X朝和++X相反的方向移动。- 随机访问迭代器 :随机访问迭代器具有双向迭代器的全部功能 。还支持这些操作 :
p+=i:使得 p 往后移动 i 个元素 ;p-=i:使得 p 往前移动 i 个元素 ;p+i:返回 p 后面第 i 个元素的迭代器 ;p-i:返回 p 前面第 i 个元素的迭代器 ;p[i]:返回 p 后面第 i 个元素的引用 。
| 容器 | 迭代器功能 |
|---|---|
| vector | 随机访问 |
| deque | 随机访问 |
| list | 双向 |
| set / multiset | 双向 |
| map / multimap | 双向 |
| stack | 不支持迭代器 |
| queue | 不支持迭代器 |
| priority_queue | 不支持迭代器 |
5 . 迭代器的辅助函数
使用时应包含头文件<algorithm>
advance(p, n):使迭代器 p 向前或向后移动 n 个元素 。distance(p, q):计算两个迭代器之间的距离 ,即迭代器 p 经过多少次 + + 操作后和迭代器 q 相等 。(如果调用时 p 已经指向 q 的后面 ,则这个函数会陷入死循环)iter_swap(p, q):用于交换两个迭代器 p、q 指向的值 。
本文深入浅出地介绍了C++标准模板库(STL),涵盖了容器、迭代器的基本概念及分类,详细解析了顺序容器、关联容器和容器适配器的特点与操作,以及迭代器的定义、使用方法和功能分类。
2万+

被折叠的 条评论
为什么被折叠?



