算法竞赛常用STL容器及其函数
向量——vector
与数组类似的一种STL容器,但其大小可以在运行过程中改变。
1 | 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与数组一样使用方括号运算符访问。
栈——stack
在该STL容器中数据先进后出,数据从下到上堆叠储存,只能访问最顶部(也就是最新添加)的数据。
1 | std::stack<int> stk; |
stk.push(1);【进栈】stk.top()【返回栈顶值】stk.pop();【出栈】stk.size()【返回大小】stk.empty()【返回是否为空】
注意:
- 需要引入头文件stack。
- vector可以当成栈来用。
- 只有栈顶可以访问,栈内部的数据不可访问。
队列——queue
在该STL容器中数据先进先出,数据从前到后次序储存,只能访问最前面(也就是最先添加)的数据
1 | std::queue<int> que; |
que.push(1);【进队】que.front()【返回队首值】que.back()【返回队尾值】que.pop();【出队】que.size()【返回队列大小】que.empty()【返回是否为空】
注意:
- 需要引入头文件queue。
- 与栈类似,队列内部的数据不可访问。
优先队列(堆)——priority_queue
在该STL容器中,数据从大到小(默认)或从小到大(可选)储存,只能访问最顶端(也就是最大/最小)的数据
1 | priority_queue<int> pque;//默认大顶堆 |
pque.push(1);【进堆】pque.top()【返回堆顶值】pque.pop();【出堆】pque.size()【返回堆大小】pque.empty()【返回堆是否为空】
注意:
- 需要引入头文件queue。
- 在声明小顶堆时,三处数据类型都应填堆中储存的数据类型。
- 与队列相似,堆内部的数据不可访问。
- 通过类似
example.top()=5;的语句给堆顶数据赋值是错误的,堆顶值不可直接修改。
集合——set
| 集合三要素 | 解释 | set | multiset | unordered_set |
|---|---|---|---|---|
| 确定性 | 一个元素要么在集合中,要么不在 | ✔ | ✔ | ✔ |
| 互异性 | 一个元素仅可以在集合中出现一次 | ✔ | ❌(任意次) | ✔ |
| 无序性 | 集合中的元素是没有顺序的 | ❌(从小到大) | ❌(从小到大) | ✔ |
1 | 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中的元素是只读的,不能修改其值。
- 不可用迭代器相减得到下标。
映射——map
该STL容器提供从键到值的映射
| 性质 | 解释 | map | multimap | unordered_map |
|---|---|---|---|---|
| 互异性 | 一个键仅可以在映射中出现一次 | ✔ | ❌(任意次) | ✔ |
| 无序性 | 键是没有顺序的 | ❌(从小到大) | ❌(从小到大) | ✔ |
1 | 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()。
字符串——string
顾名思义,用于储存字符串的STL容器
1 | string s="QAQ"; |
cin>>s;【读入字符串】cout<<s;【输出字符串】s="awa";【赋值】s[0]='b';【修改第0位字符为b】s1==s2【判断两字符串是否相等】s1+s2【连接两个字符串】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()函数的第二个参数是子字符串的长度而非子字符串的终点下标。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Roseau的博客!




