信奥考前梳理5·STL的使用

可变长数组vector

vector<int> vec;
vector<int> vec(10);  //大小为10
vector<int> vec(10, 1); //大小为10,全为1
vec.push_back(3); //在末尾插入3
cout << vec[2]; //类似数组,输出下标为2的元素
vec.pop_back(); //删除末尾元素
vec.size(); //获取元素个数
vec.clear(); //清空
vec.resize(20); //重新设置大小

遍历方法1,通过下标

for(int i = 0; i < vec.size(); i ++) {
    cout << vec[i] << ' ';
}

遍历方法2,迭代器

for(vector<int>::iterator it =vec.begin(); it != vec.end(); it ++) {
    cout << *it << ' ';
}

遍历方法3

for(int x : vec) {
    cout << x << ' ';
}

单链表

使用场景:多次插入和删除

#include <bits/stdc++.h>
using namespace std;
struct node {
    int val; //值
    int nxt; //后面的结点编号
}a[N];
int id; //用于分配的编号
    //在编号为u的结点后插入一个新结点,值为x
void insert(int u, int x) {
    id ++;
    a[id].val = x;
    a[id].nxt = a[u].nxt;
    a[u].nxt = id;
}
   //删除编号为u的结点后面的结点
void del(int u) {
    if(a[u].nxt == 0) return; //说明u后面为空
    a[u].nxt = a[a[u].nxt].nxt;
}

使用场景:

  • 先进后出
  • 括号匹配
  • 表达式求值
stack<int> stk;
stk.push(2);  //往栈顶插入
stk.push(4);
stk.pop();  //弹出栈顶
stk.top();  //获取栈顶
if(stk.empty()) //判断是否为空
stk.size();  //获取栈内元素个数

队列

使用场景:先进后出

queue<int> que;
que.push(5); //往队尾插入
que.push(4);
que.front(); //获取队头
que.pop();  //弹出队头
que.back();  //获取队尾
if(que.empty());  //判断队列是否为空
que.size(); //获取队列元素个数

双端队列

和 queue 不同,支持队尾插入和删除,队头插入和删除

deque<int> deq;
deq.push_back(5); //往队尾插入
deq.push_front(4); //往队头插入
deq.pop_back(); //删除队尾
deq.pop_front();//删除队头
if(deq.empty());//判断队列是否为空
deq.size();	//获取队列元素个数

集合

set 维护一个无重复元素的有序集合

//集合 set  不存在下标,元素只读,不能通过迭代器修改。 
set<int> st; //从小到大
st.insert(3);  //将3插入到集合
st.insert(2);
st.erase(3); //将3从集合中删除
st.clear();  //清空集合
st.size();  //获取集合大小
st.empty();  //集合是否为空
if(st.find(4) == st.end()) cout << "no";  //查询4是否在集合内
if(st.count(4) == 0) cout << "no";  //获取集合内4的个数,要么是0,要么是1,和find功能类似

遍历集合

方法1,通过迭代器遍历

for(set<int>::iterator it = st.begin(); it != st.end(); it ++) {
    cout << *it << ' ';
}
方法2
for(auto x : st) {
    cout << x << ' ';
}

由于 set 是有序的,我们也可以使用 lower_bound() 和 upper_bound(),举例:

set<int> s;
s.insert(2);
s.insert(6);
s.insert(3);
//s: 2 3 5 6
//返回s中第一个大于等于4的元素的迭代器
set<int>::iterator it = lower_bound(s.begin(), s.end(), 4);
cout << *it;  //输出5

映射

//映射 map
map<int, int> mp;
mp[2] = 3;  //插入 2--3 这一对键值对
mp[2] = 4;  //2这个键已存在,这里相当于把2--3改成2--4
mp.insert({3, 6});  //这也是插入,插入3--6这一对键值对
cout << mp[3];  //输出键3对应的值:6
if(mp.find(3) == mp.end()) cout << "no";  //查询是否存在以3为键的键值对
if(mp.count(2) == 0) cout << "no";  //获取整个map中以2为键的键值对数,要么是1要么是0
mp.erase(2);  //删除以2为键的键值对
mp.size();  //获取map的键值对数量
mp.clear(); //清空map
mp.empty(); //是否为空

遍历映射

方法1,通过迭代器遍历

for(map<int, int>::iterator it = mp.begin(); it != mp.end(); it ++) {
    cout << it->first << ' ' << it->second;
}

方法2

for(auto x : mp) {
    cout << x.first << ' ' << x.second;
}
posted @ 2024-07-16 10:40  Jared-Aya  阅读(24)  评论(0)    收藏  举报