STL容器
目录
一、vector
1、概念
2、基本用法
二、set
1、概念
2、set构建
3、基本用法
4、set 和 vector 的对比
三、map
1、插入、输出
2、find()查找
四、deque
五、stack栈
注:STL会学到迭代器,可以理解为指针
一、迭代器
下面以vector类型为例。
vector<int> v;
1.1 正向遍历
for(vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}
1.2 逆向遍历
类型:vector<int>::reverse_iterator
开始:rbegin()
结尾:rend()
for(vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); it++){cout << *it << " ";
}
1.3 auto遍历
for(auto i : v) cout << i << " ";
二、vector 动态数组
1、概念
头文件:#include<vector>
类似于数组。删除某个元素时,后面的元素自动往前移动
数据类型可以为:int、double、char、结构体等
2、基本用法
vector<int> v; //一维 vector<int> v[20]; //二维vector<int> v{1,2,3,4,5}; //直接使用花括号赋值vector<int> v(5); //初始化5个值为0的元素vector<int> v(5, 4); //初始化5个值为4的元素v.push_back(10);//在末尾插入10v.pop_back(); //删除末尾一个元素 v.insert(位置,元素); //插入元素v.insert(v.begin()+2,5) //在v[2]号位置插入5 v.size(); //获取容器长度(元素个数)v.clear(); //清空容器v.erase(v.begin()+3); //删除3号位元素,后面的元素自动往前移 v.erase(v.begin()+1,v.begin()+3); //删除 1、2号位 //v.erase(3); //错误写法//加头文件 #include<algorithm>reverse(v.begin(), v.end());sort(v.begin(), v.end());//输出:两种写法for(auto i : v) cout << i << " ";for(vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}//交换两个vectorv1.swap(v2);
三、set(主要用于:去重和排序)
5.1 概念
头文件:#include<set>
set只存value,但底层是以键值对的形式存储<键,值>,键是唯一的。set中的元素不能在容器中修改(元素总是 const 类型),但是可以从容器中插入或者删除它们。
它的查找速度极快,常用来存储各种经常被检索的数据,因为容器的底层是平衡二叉搜索树中的红黑树。
注意点总结:
- set 中 插入元素时,只需要插入 value 即可,不需要构造键值对
- set 中的元素不可以重复(因此可以使用 set 去重)
- set 中的元素默认按照 升序 来排序
- set 中的元素不允许修改
5.2 set构建
set<int> s1; // 构造一个int类型的空容器set<int> s2(s1); // 拷贝构造int类型s1容器的复制品vector<int> v1 = { 1,2,3,4,5 };
set<int> s3(v1.begin(), v1.end()); // 构造vector对象某段区间的复制品
5.3 基本用法
set<int> s={1,2,5,7,22,55};s.insert(4); //插入数字4 set<int>::iterator pos = s.find(5); //返回5的下标。如找不到返回最后一个元素的下一个位置下标 //auto pos=s.find(5) //可写成这样子cout<<pos; //输出位置 cout<<*pos; //输出值 s.erase(pos); //删除pos位置的值 若无该值会报错 s.erase(22); //删除数字22 无该值不会报错 s.erase(迭代器1,迭代器2);//e.erase(pos,s.end()); //删除pos至结尾 s.swap(s1);// 交换 set 容器中的元素 s.empty(); //判断是否为空,是1,否0s.size(); // 返回 set 中的有效元素个数s.count(x) // 返回 set 中值为 x 的元素的个数auto low=s.lower_bound(3);//如果s存在3就返回3位置的迭代器。否则返回比3大的值的迭代器auto up=s.upper_bound(3); //不管val存在还是不存在,都返回比val大的那个值//输出 for(auto i:s)cout<<i<<" "; //交换两个sets1.swap(s2);
#include<iostream>
#include<set>
using namespace std;int main(){set<int> s={1,2,3,4};// 插入元素s.insert(1);s.insert(2);s.insert(4);s.insert(5);s.insert(9);//输出cout<<"初始set: ";for(auto i:s)cout<<i<<" ";cout<<endl;//删除s.erase(9);cout<<"删除数字9: "; for(auto i:s)cout<<i<<" ";cout<<endl;cout<<"元素个数:"<<s.size()<<endl; return 0;
}
5.4 set 和 vector 的对比
vector 是一个动态数组,它允许存储重复的元素,且元素存储的顺序是按插入顺序排列
set 是一个集合,它自动去重并保持元素的有序性
set不能使用*(it+1)指向下一个元素
四、map 字典
容器中的每个存储对为一个键值对,包含两个元素(键和值)。和python字典一样。
c++中的map会自动根据first值排序。
4.1 插入、输出
#include <iostream>
#include <map>
using namespace std;int main(){//map<数据类型,数据类型> 变量;map<string,int> m;//插入-------------------//1m["数学"]=98;m["语文"]=100;//2//m.insert(pair<数据类型,数据类型>(数据1,数据2))m.insert(pair<string,int>("政治",89)); //3m.insert(make_pair("化学",98));//4 m.insert({"英语",98});cout<<m["数学"]<<endl<<endl; //遍历访问 -------------------//1for(map<string,int>::iterator it=m.begin();it!=m.end(); it++) {cout<<it->first<<" "<<it->second<<endl;}//2for(auto i:m){cout<<i.first<<" "<< i.second<<endl;//键,值}}

4.2 find()查找
返回找元素的位置,否则返回end()位置
it = m.find("123");if(it != m.end())cout<<"存在"<<it->second<<endl;
elsecout<<"不存在"<<endl;
五、queue 队列
#include <deque>
头文件queue主要包括循环队列queue和优先队列priority_queue两个容器。
queue容器:相当于队列,满足先进先出的原则,即队尾出、队首进。
priority_queue容器:相当于大根堆(或者小根堆),大根堆每次堆顶是最大元素,小根堆每次堆顶是最小元素。
5.1 queue
#include<queue>//生成
queue<数据类型> q;
queue<int> q;// 访问队头队尾
q.front(); //队头
q.back(); //队尾//插入
q.push(数据); //尾插入//删除
q.pop(); //删队头//容量
q.size(); //多少个元素//判空 ,空返回true,否则返回false
q.empty()// 清空
q.clear();
5.2 priority_queue
//priority_queue
priority_queue<int> q; //大根堆
priority_queue<int,vector<int>,less<int>> q; //大根堆
priority_queue<int, vector<int>, greater<int>> q; //小根堆//priority_queue 插入
q.push(数据); //把一个元素插入堆 //priority_queue 删除
q.pop(); //删除堆顶的元素 //priority_queue 堆顶
q.top(); //返回堆顶元素 //priority_queue 容量
q.size();//priority_queue 判空
q.empty() //空返回true,否则返回false
六、dequeue
双端队列deque是一个支持在两端高效插入或删除元素的连续线性存储空间。它就像是vector和queue的结合。与vector相比,deque在头部增删元素仅需要 O(1)的时间;与queue相比,deque像数组一样支持随机访问。
#include <deque>//dequeue 定义
dequeue<数据类型> dq;
dequeue<int> dq;//dequeue 头尾
dq.front();
dq.back();//dequeue 迭代器
dq.begin()
dq.end()//dequeue 插入
dq.push_front(数据); //头插入
dq.push_back(数据); //尾插入 //dequeue 删除
dq.pop_front(); //头删除
dq.pop_back(); //尾删除 //dequeue 容量
dq.size();//dequeue 判空
dq.empty()//dequeue 清空
dq.clear();
七、stack 栈
#include <stack>
//stack 生成
stack<数据类型> sk;
stack<int> sk;//stack 插入
sk.push(数据); //把一个元素放入栈 //stack 删除
sk.pop(); //删除栈顶的元素 //stack 栈顶
sk.top(); //返回栈顶元素 //stack 容量
sk.size();//stack 判空,空返回true,否则返回false
sk.empty()
