STL
一、vector
本质上是一个动态数组,运用了一个倍增的思想
empty( ) 和 size( ) 是所有容器都有的操作
#include <vector>
int main()
{
vector<int> a; //定义一个a数组
//vector<int> a(n) 定义一个长度为n的a数组
//vector<int> a(10, 3) 定义一个长度为10,元素都是3的a数组
//判断是否为空,空返回true,非空返回false
a.empty();
//返回容器长度,时间复杂度为O(1)
a.size();
//清空
a.clear();
//返回第一个元素,返回最后一个元素
front(); / back();
//在最后面加入一个元素,将最后一个元素弹出
push_back(); / pop_back();
//迭代器,第0个元素,最后一个元素后面一个数
begin(); / end();
//vector支持随机寻址,跟数组一样
//有三种遍历方式
for (int i = 0; i < a.size(); i++)
cout << a[i] << ' ';
for (vector<int>::iterator i = a.begin(); i != a.end(); i++)
cout << *i << ' ';
for (auto x : a) //auto可以自动推断变量的类型
cout << x << ' ';
//vector支持比较运算,按字典序进行排序
vector<int> a(4, 3), b(3, 4);
if (a < b) puts("a < b");
return 0;
}
系统为某一程序分配空间时,所需时间与空间大小无关,与申请次数有关。
二、pair
可以存储一个二元组,first 第一个元素,second 第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(类似于字典序),常用于排序
int main()
{
pair<int, string> p;
//访问第一个元素,访问第二个元素
p.first(); p.second();
//构造一个pair
p = make_pair(10, "psy");
//初始化
p = (10, "abc");
//三重
pair<int, pair<int, int>> p;
return 0;
}
三、string
处理字符串
substr() 返回某一个字串
c_str() 返回string字符数组对应的头指针
#include <string>
int main()
{
string op;
//长度,判空,清空
op.size()/op.length();op.empty();op.clear();
//添加
op += "abc";
//返回某个子串
//两个参数,分别代表头和子串的长度,如果尾超过长度,则返回全部,或者只写一个参数,返回从这个参数往后所有元素
a.substr(2, 10);
a.substr(2);
//用printf返回整个字符数组,用c_str()
printf("%s\n", a.c_str());
return 0;
}
四、queue、priority_queue
queue:push() 往队尾插入元素;front() 返回队头元素;pop() 弹出队头元素
#include <queue>
int main()
{
queue<int> q;
//长度;判空
q.size(); q.empty();
//队尾插入;返回队头;返回队尾;弹出队头
q.push(); q.front(); q.back(); q.pop();
//清空
q = queue<int>();
return 0;
}
priority_queue:优先队列,其实是一个堆,push() 往堆里插入一个元素;top() 返回堆顶元素;pop() 弹出堆顶元素
#include <queue>
#include <vector>
int main()
{
priority_queue<int> heap; //默认大根堆
//定义小根堆
priority_queue<int, vector<int>, greater<int> > heap;
//插入一个元素、返回堆顶元素、弹出堆顶元素
heap.push(); heap.top(); heap.pop();
return 0;
}
五、stack
栈:先进后出,后进先出
#include <stack>
int main()
{
stack<int> s;
//长度、判空
s.size(); s.empty();
s.push(); //往栈顶加入一个元素
s.top(); //返回栈顶元素
s.pop(); //弹出栈顶元素
return 0;
}
六、deque
双端队列,队头队尾都可以插入弹出,可看作是一个加强版的vector
#include <deque>
int main()
{
//长度、判空、清空
size(); empty(); clear();
//返回头和尾
front(); back();
//插入和删除尾元素
push_back(); pop_back();
//插入和删除头元素
push_front(); pop_front();
//使用迭代器返回头和尾
begin(); end();
//支持随机寻址
[];
return 0;
}
七、set、map、multiset、multimap
基于平衡二叉树(红黑树)来实现,动态地维护有序序列
set
#include <set>
int main()
{
set<int> s; //会自动删掉重复元素
multiset<int> ms; //允许重复元素存在
//长度、判空、清空
s.size(); s.empty(); s.clear();
//迭代器,返回某个数的前驱和后继 O(logn)
begin(); end();
//插入一个元素
s.insert();
//查找一个数,没有则返回end
s.find();
//返回一个数的个数
s.count();
//删除有两种操作
// (1)输入是一个数x,删除所有x
// 时间复杂度为 O(k + logn) k为x的个数
// (2)输入是一个迭代器,删除则个迭代器
s.erase();
//返回大于等于x的最小的数
lower_bound();
//返回大于x的最小的数
upper_bound();
return 0;
}
map
#include <map>
int main
{
map<string, int> a;
insert(); //插入的数是一个pair
erase(); //插入的参数是pair或者迭代器
find(); //查找一个数
//如下操作,返回1
a["abc"] = 1;
cout << a["abc"] endl;
return 0;
}
八、unordered_set、unordered_map、unordered_multiset、unordered_multimap
基于哈希表来实现
同上面类似,增删查改的时间复杂度大多是 O(1).
不支持 lower_bound() / upper_bound() ,迭代器的加加减减,所有与排序有关的都不支持
九、bitset
压位
#include <iostream>
int main()
{
bitset<10000> s;
//支持以下操作
~, &, |, ^
>>, <<
==, !=
[]
count(); //返回有多少个1
any(); //判断是否至少有一个1
none(); //判断是否全为0
set(); //把所有位置变成1
set(k, v); //将第k位变成v
reset(); //把所有位置变成0
flip(); //等价于取反~
flip(k); //把第k位取反
return 0;
}