
本人整理了一些常用的STL容器及其成员函数,该文章整理自UP主ChrisKim_ZHT的视频BV1L8411y7th,不过只整理了容器部分,其余部分有待他日继续学习。
—以下是正文—
1. 向量——vector
与数组类似的一种STL容器,但其大小可以在运行过程中改变。
std::vector<int> vec(3,1);//初始化其大小为3,初值为1
vec.push_back(1);【尾接】vec.pop_back();【尾删】vec.clear();【清空】vec.empty()【返回是否为空】vec.size()【返回大小】vec.resize(5,3);【将vec空间重置为5,多出来的空间初始化为3】
注意:
- 需要引入头文件vector。
- 在声明vector时尽量初始化其空间大小,用push_back()函数扩大向量空间时有额外时间开销。
- size()函数返回的类型数据存储范围较小,小心其溢出。
- vector与数组一样使用方括号运算符访问。
2. 栈——stack
在该STL容器中数据先进后出,数据从下到上堆叠储存,只能访问最顶部(也就是最新添加)的数据。
std::stack<int> stk;
stk.push(1);【进栈】stk.top()【返回栈顶值】stk.pop();【出栈】stk.size()【返回大小】stk.empty()【返回是否为空】
注意:
- 需要引入头文件stack。
- vector可以当成栈来用。
- 只有栈顶可以访问,栈内部的数据不可访问。
3. 队列——queue
在该STL容器中数据先进先出,数据从前到后次序储存,只能访问最前面(也就是最先添加)的数据
std::queue<int> que;
que.push(1);【进队】que.front()【返回队首值】que.back()【返回队尾值】que.pop();【出队】que.size()【返回队列大小】que.empty()【返回是否为空】
注意:
- 需要引入头文件queue。
- 与栈类似,队列内部的数据不可访问。
4. 优先队列(堆)——priority_queue
在该STL容器中,数据从大到小(默认)或从小到大(可选)储存,只能访问最顶端(也就是最大/最小)的数据
priority_queue<int> pque;//默认大顶堆
priority_queue<int,vector<int>,greater<int>> pque;//小顶堆
pque.push(1);【进堆】pque.top()【返回堆顶值】pque.pop();【出堆】pque.size()【返回堆大小】pque.empty()【返回堆是否为空】
注意:
- 需要引入头文件queue。
- 在声明小顶堆时,三处数据类型都应填堆中储存的数据类型。
- 与队列相似,堆内部的数据不可访问。
- 通过类似
example.top()=5;的语句给堆顶数据赋值是错误的,堆顶值不可直接修改。
5. 集合——set
| 集合三要素 | 解释 | set | multiset | unordered_set |
|---|---|---|---|---|
| 确定性 | 一个元素要么在集合中,要么不在 | ✔ | ✔ | ✔ |
| 互异性 | 一个元素仅可以在集合中出现一次 | ✔ | ❌(任意次) | ✔ |
| 无序性 | 集合中的元素是没有顺序的 | ❌(从小到大) | ❌(从小到大) | ✔ |
set<int> st;
st.insert(1);【插入元素】st.erase(1);【擦除元素】st.find(3)【查找元素,找到则返回指向该元素的迭代器,否则返回伪迭代器xxx.end()】st.count(1)【返回元素在集合中的数量】st.size()【返回集合大小】st.clear();【清空集合】st.empty()【返回集合是否为空】
注意:
- 需要引入头文件set。
- set只能用迭代器遍历,不能使用中括号下标访问。
- set中的元素是只读的,不能修改其值。
- 不可用迭代器相减得到下标。
6. 映射——map
该STL容器提供从键到值的映射
| 性质 | 解释 | map | multimap | unordered_map |
|---|---|---|---|---|
| 互异性 | 一个键仅可以在映射中出现一次 | ✔ | ❌(任意次) | ✔ |
| 无序性 | 键是没有顺序的 | ❌(从小到大) | ❌(从小到大) | ✔ |
map<int,int> mp;
mp[2]=1;【增加键2映射到1】mp[2]=2;【修改2映射到2】mp.find(2)【查找键,找到则返回指向该键的迭代器,否则返回伪迭代器xxx.end()】mp.erase(2);【擦除键及其映射】mp.count(2)【返回键在map中出现的次数】mp.size()【返回map的大小】mp.clear();【清空map】mp.empty()【返回map是否为空】
注意:
- 需要引入头文件map。
- map中不存在的键对应的值默认为0。
- map中的键默认按从小到大排序(字符/字符串按字典序),若需要从大到小排序可在声明时添加参数greater()。
7. 字符串——string
顾名思义,用于储存字符串的STL容器
string s="QAQ";
cin>>s;【读入字符串】cout<<s;【输出字符串】s="awa";【赋值】s[0]='b';【修改第0位字符为b】s1==s2【判断两字符串是否相等】s1+s2【连接两个字符串】s.size()【返回字符串的大小】s.erase(0,1);【删除从字符串第0位开始的1个字符(不加第二个参数默认从起始位一直删到最后一位)】s.substr(3,4)【返回从第三位开始,长度为4的子字符串(不加第二个参数默认到最后一位)】s.find("123")【在字符串中查找子字符串123,若找到返回指向子字符串第一位字符的迭代器,若未找到返回string::npos】stoi(s)【将字符串转化为int型并返回(转化为其他变量类型也可,long long用ll,long double用ld,double用d,float用f,以此类推)】to_string(x)【将其他类型变量x转化为string并返回】
注意:
- 需要引入头文件string。
- 向string尾接字符或字符串时建议用
s+='a';而非s=s+'a';,使用后一种方法容易超时。 - 要注意substr()函数的第二个参数是子字符串的长度而非子字符串的终点下标。