1.STL用法总结
容器分为序列式容器和关联式容器。
序列式容器:每个元素有固定的位置,取决于插入的时间,与元素值无关。例如,vector,queue,deque,list,stack,
关联式容器:取决于特定的排序准则,和插入顺序无关。例如,set,multiset,map,multimap。
1.vector(向量)
头文件:
#include <vector>
1.1 介绍
vector
为可变长数组(动态数组),定义的vector
数组可以随时添加数值和删除元素。
注意:在局部区域中(比如局部函数里面)开vector数组,是在堆空间里面开的。
在局部区域开数组是在栈空间开的,而栈空间比较小,如果开了非常长的数组就会发生爆栈。
故局部区域不可以开大长度数组,但是可以开大长度vector
。
1.2 一维数组初始化
vector<int> a; //定义了一个名为a的一维数组,数组存储int类型数据
vector<double> b;//定义了一个名为b的一维数组,数组存储double类型数据
vector<node> c;//定义了一个名为c的一维数组,数组存储结构体类型数据,node是结构体类型
指定长度和初始值的初始化
vector<int> v(n);// 定义一个长度为n的数组,初始值默认为0,下标范围[0, n - 1]
vector<int> v(n, 1);// v[0] 到 v[n - 1]所有的元素初始值均为1 //注意:指定数组长度之后(指定长度后的数组就相当于正常的数组了)
拷贝初始化
vector<int> a(n + 1, 0); vector<int> b(a); // 两个数组中的类型必须相同,a和b都是长度为n+1,初始值都为0的数组
vector<int> c = a; // 也是拷贝初始化,c和a是完全一样的数组
1.3 二维数组初始化
定义第一位维固定长度为 5,第二维可变化的二维数组
vector<int> v[5];//定义可变长二维数组
//注意:行不可变(只有5行), 而列可变,可以在指定行添加元素
//第一维固定长度为5,第二维长度可以改变
2.方法函数
代码 | 含义 |
---|---|
q.front() | 返回第一个数据O ( 1 ) |
q.back() | 返回最后一个数据 |
q.pop_back() | 删除最后一个数据 |
q.push_back(ele) | 尾部添加一个数据 |
q.size() | 返回容器内元素个数 |
q.clear() | 清除所有元素 |
q.resize(n,v) | 改变数组大小为 n,每个空间赋为 v,默认赋值0 |
q.insert(it,x) | 向迭代器it,插入一个元素x。O(n) |
q.erease(begin,end) | 删除[begin,end) 的所有函数 |
q.begin() | 返回首元素的迭代器 |
q.end() | 返回最后一个迭代器 |
q.empty() | 判断是否为空,为空为1,否则为0 |
其中,q.end() 返回的是最后一个位置的后一个位置,所有STL容器都如此
使用 vi.resize(n, v) 函数时,若 vi 之前指定过大小为 pre
pre > n :即数组大小变小了,数组会保存前 n 个元素,前 n 个元素值为原来的值,不是都为 v pre < n :即数组大小变大了,数组会在后面插入 n - pre 个值为 v 的元素 也就是说,这个初始值 v 只对新插入的元素生效。
排序使用sort,为 sort(q.begin(),q.end());
对所有元素排序,如果要指定区间进行排序,可以对参数进行改动
vector<int> a(n + 1); sort(a.begin() + 1, a.end()); // 对[1, n]区间进行从小到大排序
2.1 访问
1.下标法:和普通数组一样,下标是从 0开始的
2.迭代器:类似指针一样的访问
vector<int> vi; //定义一个vi数组 vector<int>::iterator it = vi.begin();
//声明一个迭代器指向vi的初始位置
vector<int>::iterator it = vi.begin(); for(int i = 0; i < 5; i++) cout << *(it + i) << " "; cout << "\n";
3.使用auto:但是会访问数组的所有元素(包括0),auto能自动识别并获取类型
// 1. 输入
vector<int> a(n); for (auto &x: a) {
cin >> x;// 可以进行输入,注意加引用 }
// 2. 输出
vector<int> v;
v.push_back(12);
v.push_back(241);
for(auto val : v) {
cout << val << " "; // 12 241 }
2.stack(栈)
1.介绍
是一个先进后出,后进先出的容器。
//头文件需要添加
#include<stack>
//声明
stack<int> s; stack<string> s; stack<node> s;//node是结构体类型
2.方法函数
代码 | 含义 |
---|---|
s.push(ele) | 元素ele入栈,增加元素 |
s.pop() | 移除栈顶元素 |
s.top() | 取得栈顶元素(不删除) |
s.empty() | 检测栈内是否为空 |
s.size() | 返回栈内元素个数 |
2.1 遍历
栈只能对栈顶进行操作,如果遍历,需要一个一个取出
stack<int> st;
for (int i = 0; i < 10; ++i)
st.push(i);
while (!st.empty()) {
int tp = st.top(); // 栈顶元素
st.pop(); }
3.queue(队列)
1.介绍
队列是一种先进先出的数据结构
//头文件
#include<queue>
//定义初始化
queue<int> q;
2.方法函数
代码 | 含义 |
---|---|
q.front() | 返回队首元素 |
q.back() | 返回队尾元素 |
q.push(ele) | 尾部添加一个元素ele进队 |
q.pop() | 删除队首元素 |
q.size() | 返回队内元素个数 |
q.empty() | 判断是否为空,为空返回 1 |