c++ STL与常用库函数
vector(变长数组)
- 概述
数组属于静态内存空间,一经分配内存便无法改变大小,为了使数组更为灵活,封装为vector。
vector底层实现为数组,封装之后的vector在外部看来是一个可变长的顺序容器。在创建vector时会申请一块长度为n的连续内存区域。
vector内部维护两个指标cur_len,max_len,分别表示当前元素的个数和总共可以填充元素个数。
当cur_len = max_len时,数组扩容,申请两倍大小的内存空间,将原来元素拷贝。
当cur_len = max_len / 4, 数组缩容,回收内存空间,并进行元素拷贝。
- 使用注意点:
由于每次扩大和缩小都是成倍的,因此数组大小变化相对与每次操作是平均O(1)。
功能:变长数组,支持随机访问,不支持在任意位置O(1)插入。为了保证效率,元素的增删一般应该在末尾进行
#include<vector> //头文件
vector<int> a; //相当于一个长度动态变化的int 数组
vector<int> b[233]; //相当于第一维长233,第二位长度动态变化的int数组
struct rec{
…};
vector<rec> c; //自定义的结构体类型也可以保存到vector中
----------------------
vector<int> a;
a.size(); //长度(元素个数)
a.empty(); //判断是否为空,空返回1
a.clear(); //清空
vector<int>::iterator it; //迭代器、支持相加减
*it //相当于a[it]
a.begin(); //返回第一个元素的迭代器
a.end(); //返回最后一个元素后一个位置的迭代器
a.front(); //返回第一个元素
a.back(); //返回最后一个元素
a.push_back(x); //把元素x插入到vector a的尾部、O(1)
a.pop_back(); //删除vector a的最后一个元素
//三种遍历
for(int i = 0; i < a.size(); i++ )
for(auto it = a.begin(); it != a.end(); it++ )
for(int x : a)
queue(队列)
- 概述:
与vector的实现基本类型,只是暴露出一部分接口供外部访问,使得queue满足抽象的先进先出数据结构。
- 使用注意点:
先进先出
头文件queue主要包括循环队列queue和优先队列priority_queue两个容器
#include<queue> //头文件
queue<int> q;
struct rec{
…};
queue<rec> q;
priority_queue<int> q; // 大根堆、优先弹出最大值
priority_queue<int, vector<int>, greater<int>> q; // 小根堆、优先弹出最小值
priority_queue<pair<int, int>> q;
struct rec