对STL进行总结,STL是standard template library的简写,是C++中的一个标准模板库,用于实现常用的数据结构和算法,它是C++程序员经常使用的一个工具箱。STL 的主要目的是提高开发效率和代码质量,使得程序员可以更加便捷地完成常见的操作。里面包括:算法(algorithm)、容器(container)、仿函数(functors)、迭代器(iterator)等,这篇文章先说容器
容器
容器之所以叫容器,可以抽象理解为我们装东西的容器,比如装水的盒子,只不过C++里的容器是用于装数据,STL这个库里面,它提供了很多种容器类型用于存储数据。主要包括vector(动态数组)、set(集合)、map(映射)、stack(栈)、queue(队列)、priority—queue(优先队列)、string(字符串)、pair(二元组)
- vector:可以动态调整大小的数组,支持快速的随机访问和迭代器访问,并且支持在尾部添加或删除元素。
- set:有序集合,其中每个元素都是唯一的,支持快速的查找和插入操作。
- unordered_set:无序集合,其中每个元素都是唯一的,支持快速的查找和插入操作,但元素的顺序是未定义的。
- map:有序映射,其中每个元素都有一个唯一的键值对,支持快速的查找和插入操作。
- unordered_map:无序映射,其中每个元素都有一个唯一的键值对,支持快速的查找和插入操作,但元素的顺序是未定义的。
- deque:双端队列,支持快速的随机访问和迭代器访问,并且支持在头部和尾部添加或删除元素。
- list:双向链表,只支持迭代器访问,并且支持在任意位置添加或删除元素。
vector
它的和数组差不多,区别就是他的长度是动态可变的,存储在堆中,一般可以替换普通数组
#include<vector>
vector<类型> 数组名(长度,[初值]) //构造
vector<int> arr; //构造int数组
vector<int> arr(100); //构造初始长度100的数组
vector<int> arr(100,1); //构造初始长度100的数组,初值为1
vector<vector<int> mat(100,vector<int>()); //构造初始100行,不指定列数的二维数组
vector<vector<int>> mat(100,vector<int>(666,-1)); //构造初始100行,初始列600的二维数组,初始值-1
vector<vector<vetcor<int>>> mat1(100, vector<vector<int>>(6,vector<int>(4))); //构造初始100行,初始列6的三维维数组,
尾接&尾删
- push_back(元素):在vector尾接一个元素,数组长+1
- pop_back():删除vector尾部的一个元素,数组长度-1
改变长度
数组名.resize()
arr.resize(100); //将vector的长度改为100
set
set 里的元素只出现一次,且元素没有顺序 ,因此适用于对元素去重,维护顺序等
#include<set>
set<类型,比较器> 集合名 //构造
set<int> st; //存储int集合(从小到大)
set <int,greater<int>> st1; //存储int集合(从大到小)
遍历
使用迭代器进行遍历
#include<bits/stdc++.h>
using namespace std;int main()
{set<int> st; //构造一个集合st.insert(1); //插入1st.insert(2); //插入2st.erase(1); //删除1st.find(2); //找到1就返回1//遍历for (set<int>::iterator it = st.begin(); it !=st.end(); ++it){cout << *it <<endl;}return 0;
}
map
有序键值对结构,底层原理是黑红树。一个键只可以在映射中出现一次,且没有顺序
健类型:要存储健的数据类型
值类型:要存储的数据类型
比较器:键要比较大小使用的比较器,默认为less<数据类型>,可自定
#include<map>
map<健类型,值类型,比较器> 名字 //构造map
map<int,int> mp; // int—>int的映射(从小到大)
map<int,int,greater<int>> mp1; // int—>int的映射(从大到小)
mp[1] = 2; //增加
mp.erase(1); // 删除1这个键
mp[1] = 3; // 改
cout << mp[1] << endl; //查
mp.count(元素); //检查元素是否存在
for(map<int,int>::iterator it =mp.begin(); it != mp.end(); ++it)
{ cout << it -> first << ' ' << i-> second << endl;
}//上述用迭代器的方法太长 不好读 一般使用下面基于范围循环的方法for(auto &m:mp) //&是引用 m 是自定义的 mp是要便利的map的名字
{cout<<m.first << '' << m.second << endl;
}
stack
通过二次封装双端队列(queue),实现先进后出的栈数据结构
#include<stack>
stack<数据类型> 名字
stack<int> stk; //构造一个栈
stk.push(1); //进栈
stk.pop(); //出栈
stk.top(); //取顶栈
queue
先进先出
#include<queue>
queue<数据类型> 队名 //构造队列
queue<int> que; //构造一个叫que的队列
que.push(元素); //进队
que.pop(); //出队
que.front() ; //取队首
que.back(); //取队尾
deque
首尾都可插入和删除的队列为双端队列
双端队列排序一般不用
priority_queue
优先队列是在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。
可以实现每次从优先队列中取出的元素都是队列中优先级最大的一个
#include<queue>
priority_queue<数据类型> 名字 //构造一个优先队列
priority_queue<int> q1; // 默认大根堆, 即每次取出的元素是队列中的最大值
priority_queue<int, vector<int>, less<int> > q2; // 大根堆, 每次取出的元素是队列中的最大值,同第一行priority_queue<int, vector<int>, greater<int> > q3; // 小根堆, 每次取出的元素是队列中的最小值
string
存储字符串
string (长度,初值) //构造函数
string s1; //构造字符串,为空
string s2 ="abcde"; //构造字符串 并赋值abcd
string s3(10,'6'); //通过构造函数构造为66666666666
cin >> s1; //输入字符串
cout << s1; //输出字符串
s1+="fgj"; //尾接字符串
pair
存储二元组,两个元素的一个组合
#include<utiity>
pair<类型,类型> pr //构造一个二元组
pari<int, int> p1; //存储int型的元组
pair<int, long long> p2;
pair<int, char> pr3={1,'a'}; //赋值 第一个元素是1,第2个元素是a
int a = pr.first; //取第一个值
int b = pr.second; //取第二个值