STL学习笔记
什么是STL
STL(Standard Template Library),即标准模板库,是一个高效的C++程序库
被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性
STL 提供了六大组件,彼此组合套用协同工作。这六大组件分别是:
- 容器(Containers):各种数据结构,如
vector、list、deque、set、map
等。从实现的角度来看,容器是一种 class template。 - 算法(Algorithms):各种常用算法,提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作,比如
sort、search、copy、erase
。从实现的角度来看,STL 算法是一种 function template。 - 迭代器(Iterators):迭代器用于遍历对象集合的元素,扮演容器与算法之间的胶合剂,是所谓的“泛型指针”,共有 5 种类型,以及其他衍生变化。从实现角度来看,迭代器是一种将
operator*、operator->、operator++、operator--
等指针操作予以重载的 class template。所有的 STL 容器附带有自己专属的迭代器,因为只有容器设计者才知道如何遍历自己的元素。 - 仿函数(Functors):也称为函数对象(Function object),行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了 operator() 的 class 或者 class template。
- 适配器(Adaptors):一种用来修饰容器或者仿函数或迭代器接口的东西。例如 STL 提供的
queue
和stack
,就是一种空间配接器,因为它们的底部完全借助于deque
。 - 分配器(Allocators):也称为空间配置器,负责空间的配置与管理。从实现的角度来看,配置器是一个实现了动态配置空间、空间管理、空间释放的 class template。
数据结构
容器 | 类名 | 描述 |
---|---|---|
向量 | vector | 连续存储的元素。 |
列表 | list | 由节点组成的双向链表,每个结点包含着一个元素。 |
双端队列 | deque | 连续存储的指向不同元素的指针所组成的数组。 |
集合 | set | 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序。 |
多重集合 | multiset | 允许存在两个次序相等的元素的集合。 |
栈 | stack | 后进先出的值的排列。 |
队列 | queue | 先进先出的值的排列。 |
优先队列 | priority_queue | 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列。 |
映射 | map | 由 {key, value} 键值对组成的集合,以某种作用于键对上的谓词排列。 |
多重映射 | multimap | 允许键对有相等的次序的映射。 |
vector
简介
- 向量属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)
- 数据结构很像一个数组,所以与其他容器相比,vector 能非常方便和高效访问单个元素,支持随机访问迭代子
- 向量是动态结构,它的大小不固定,可以在程序运行时增加或减少
与数组不同,向量的内存用尽时,向量自动分配更大的连续内存区,将原先的元素复制到新的内存区,并释放旧的内存区;这是向量类的优点
简要描述:vector动态开点,常用于图论
基本操作
#include<vector>//头文件 vector<int> vec;//定义 vec.push_back(a);// 尾部插入数字 cout<<vec[0]<<endl;//使用下标访问元素,记住下标是从0开始的 //使用迭代器访问元素 vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl; //使用迭代器访问元素 vec.insert(vec.begin()+i,a);//在第i+1个元素前面插入a vec.erase(vec.begin()+4);//删除第5个元素 vec.erase(vec.begin()+i,vec.end()+j);//删除区间[i,j-1];区间从0开始 vec.size();//向量大小 vec.resize;//改变向量大小 vec.clear();//清空向量
begin()和end()怎么使用?
/*begin()和end()产生指向容器的第一个元素和最后一个元素的下一个位置的迭代器,常用于标记容器中元素的迭代范围。另外,容器还定义了rbegin()和rend(),返回指向容器最后一个元素和第一个元素的前一个位置的反向(reverse)迭代器。Begin()和end()与索引下标不同,所以不是int类型。*/ //输出指定的整型顺序容器的元素 Template<class T> void printContainer(const char *msg, const T& s) { cout<<msg<<”:”; copy(s.begin(), s.end(), ostream_iterator<int>(cout, “ “)); // ostream_iterator是用于输出的迭代器类,ostream_iterator<int>(cout, “ ”) 绑定标准输出装置。“ ”代表每个字符以空格间隔 cout<<endl; }
stack
简介
stack即栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
——百度百科
简要描述:stack完成的功能是栈,即队列中后进先出
基本操作
#include<stack>//头文件 stack<int> s;//定义 s.push()//将变量压入栈顶 s.pop()//栈顶出栈,无返回值 s.top()//返回栈顶元素,不出栈 s.empty()//判断栈是否为空,不空返回false,空返回true s.size()//返回栈中元素的个数 s.swap(s,s1)//交换两个栈(s,s1)中全部元素
queue
简介
queue即队列
简要描述:queue完成的功能是队列,即先进先出
基本操作
#include<queue>//头文件 queue<int> q;//定义 q.front() // 获取队首元素,但并不删除 q.back() // 获取队尾元素,但并不删除 q.pop() // 删除队首元素,无返回值 q.push() // 向队列中加入元素,放置队列末尾 q.empty() // 判断队列是否为空,不空返回false,空返回true q.size() // 返回队列中元素的个数
string
简介
详见专区
简要描述:string是字符串模板类,可理解字符数组。访问元素可通过[]
完成,对象赋值可使用=
基本操作
#include<string>//头文件 string s;//定义 cout<<s[0]<<endl;//使用下标访问元素,记住下标是从0开始的 assign(s,b,c)//使用s对象对a赋值,从b开始到c结束(0开始,左闭右闭)。缺省bc全部赋值 s.length()//返回字符串的长度 s.size()//返回字符串的长度 append(s,b,c)//添加至字符串末尾,从b开始到c结束(0开始,左闭右闭)。缺省bc全部赋值 <、<=、==、!=、>=、> 对象间比较大小。 s1.compare(b,c,s2,m,n)//比较两string对象大小,b,c是s1索引,m,n是s2索引。均可缺省。返回值三种:大于0,等于0,小于0 s1.swap(s2)//s1与s2对象交换内容 s.substr(m,n)//取子串,从m索引开始,长度为n。n可缺省 s1.replace(b,c,s2,m,n)//字符串替换,用s2的[m,n]替换s1的[b,c]。c-b=n-m。 s.erase(b, c)//删除子串[b,c],后面依次向前补。c可缺省,删除到底 s1.insert(b,s2)//在s1索引b处插入对象s2,s1依次向后串 s.find(b,c)//返回值是int型,返回出现指定字符的下标。b是内容,c是开始位置(可缺省)。常通过for循环使用,终止条件是:(position=s.find(b,c))!=string::npos
unordered_set
简介
简要描述:unordered_set相当于一个集合,集合的组织无序。数量唯一,只是用来判断是不是存在。
基本操作
#include<unordered_set>//头文件 unordered_set< int> a;//定义 a.find() // 查找目标数值,找到返回迭代器。常使用的模板是s,find(a) != s.end() a.count() // 返回指定值出现的次数,返回值为int型 a.empty() // 判断是否为空,不空返回false, 空返回true a.size() // 返回数组大小 a.insert() // 插入元素,参数即插入的元素值 a.emplace() // 插入元素 a.erase() // 删除操作,两种方式:指定数值或者是迭代器。删除指定数值,返回值是0/1,代表是否删除成功。删除迭代器,返回值是下一个位置的迭代器。失败返回a.end()。
注意:Insert()函数的功能是在vector容器的指定位置插入一个或多个元素;Emplace()是C++11新增的成员函数,用于在vector容器的指定位置之前插入一个新的元素。二者在功能上没有很大的区别。区别在于实现原理:Emplace()最大的作用是避免产生不必要的临时变量,直接在指定位置(in place)构造元素,只需要调用类的构造函数而无需调用复制构造函数。它的实现主要是依靠C++11的两个新特性:变参模板和完美转发。“变参模板”使得Emplace()可以接受任意参数,就可以适用于任意对象的构建。“完美转发”使得接收下来的参数 能够原样的传递给对象的构造函数。
更为详细内容可参考:https://www.cnblogs.com/narjaja/p/10039509.html
unordered_map
简介
简要描述:unordered_map用于键值和数值的无序唯一排列,用于有二维要求的问题。也相当于一维数组,键值为索引,数值为数组值(赋值时可以这么理解使用[]
,遍历时不使用[]
)可以理解为集合中有多个相同无序元素。
基本操作
#include<unordered_map>//头文件 unordered_map<int,int> a;//定义 a.begin()/a.end() // 迭代器,不是int型 a.size() // 返回有效元素的个数 a.empty() // 返回数组是否为空,不空返回false,空返回true a.insert() // 插入元素,成对儿插入。插入的方式有两种:{0,1},pair<int, int>(0,1)。后者更常用 a.erase() // 删除元素,删除有两种类型:迭代器删除或键值删除。键值删除,返回值是删除的个数。例如:num = s.erase(1)——删除键值为1的元素,并返回个数给num。迭代器删除,返回值是下一个位置的迭代器。例如:iter = s.erase(s.begin())。Iter指向第二个元素的迭代器 a.clear() // 清空所有元素 a.find() //查找给定主键的位置,返回的是迭代器。常用的判断语句时:s.find(0) != s,end() a.count() //返回值为int型,返回目标主键的个数。没找到就是0了
map
简介
简要描述:map用于键值和数值对应。按照键值有序排列(从小到大)。相当于一维数组,键值为索引,数值为数组值(赋值时可以这么理解使用[]
,遍历时不使用[]
)可以理解为集合中有多个相同有序元素
基本操作
#include< map>//头文件 map<int,int> a//定义 a.insert() // 插入元素,成对儿插入。插入的方式有两种:{0,1},pair<int, int>(0,1)。后者更常用 a.erase() // 删除元素,删除有两种类型:迭代器删除或键值删除。键值删除,返回值是删除的个数。例如:num = s.erase(1)——删除键值为1的元素,并返回个数给num。迭代器删除,返回值是下一个位置的迭代器。例如:iter = s.erase(s.begin())。Iter指向第二个元素的迭代器 a.find() //查找给定主键的位置,返回的是迭代器。常用的判断语句时:s.find(0) != s,end() a.clear() // 清空所有元素 a.count() //返回值为int型,返回目标主键的个数。没找到就是0了 a.empty() // 返回数组是否为空,不空返回false,空返回true a.size() // 返回有效元素的个数 iter->first/iter->second // iter代表迭代器,first访问键值,second访问数值
对于map/set,unorderedmap/unorderedset
迭代器定义方式为如下:容器类名::iterator
迭代器名;
例如:
unordered_set< int>::iterator a; set< int>::iterator a; unordered_map<int, string>::iterator a; map<int, string>::iterator a;
本文作者:ccrui
本文链接:https://www.cnblogs.com/ccr-note/p/stl-all.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步