C++ STL 的简单介绍

本文深入浅出地介绍了C++标准模板库(STL),涵盖了容器、迭代器的基本概念及分类,详细解析了顺序容器、关联容器和容器适配器的特点与操作,以及迭代器的定义、使用方法和功能分类。

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 . 定义方法(按定义分类)

  1. 正向迭代器容器类名::iterator 迭代器名;
  2. 常量正向迭代器 :容器类名::const_iterator 迭代器名;
  3. 反向迭代器容器类名::reverse_iterator 迭代器名;
  4. 常量反向迭代器 :容器类名::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++的执行速度更快 。
  • 容器适配器stackqueuepriority_queue没有迭代器。容器适配器有一些成员函数,可以用来对元素进行访问 。

4 . 迭代器按功能分类

不同容器的迭代器,其功能强弱有所不同。容器的迭代器的功能强弱,决定了该容器是否支持 STL 中的某种算法 。

  • 正向迭代器 :支持以下操作 :++pp++*p
  • 双向迭代器 :具有正向迭代器的全部功能 。除此之外 ,若X是一个双向迭代器,则--XX--都是有定义的。--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 指向的值 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值