acm中比较常见的stl用法
vector 向量 变长数组 倍增的思想
pair
string
queue 队列 priority_queue 优先队列(堆)
stack 栈
deque 双端队列
set , map, multiset ,multimap 基于平衡二叉树(红黑树)
unordered_set, unordered_multiset, unordered_map unordered_multimap 哈希表
bitset 压位
vector
vector 在头文件#include<vector>
并位于 std 命名空间中
vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。
初始化
vector<int> a;
vector<int> a(10); //初始a的长度为10,它们的默认初始值都为 0。
vector<int> a(10,3); //初始a的长度为10,每个元素值为3
vector<int> b{2, 3, 5, 7, 11, 13, 17, 19}; //创建的同时指定初始值以及元素个数
vector<char>value1(5, 'c');
vector<char>value2(value1); 把value1拷贝到value2
vector<int>value1{1,2,3,4,5};
vector<int>value2(begin(value1),begin(value1)+3);//value2保存{1,2,3}
方法
a.size(); //a的元素个数
a.empty(); //a是否为空,若无元素,则返回 true;反之,返回 false。
a.clear(); //清空a
a.front()/a.back() //返回a的第一个数/返回a的最后一个数
a.push_back() //向尾部插入
a.pop_back() //删除队尾元素
a.begin()/a.end() //返回指向a的第一个元素的迭代器/返回指向a最后一个位置的下一个位置的迭代器
a[] //支持随机存储
支持比较运算(按字典序排)
vector<int> a(3,4),b(4,3);
if (a>b) cout<<"Yes";
输出
Yes
遍历vector
for(int i=0;i<10;i++) a.push_back(i);
for(int i=0;i<a.size();i++) cout<<a[i]<<' ';
cout<<endl;
for(vector<int>::iterator i=a.begin();i!=a.end();i++) cout<<*i<<' ';
cout<<endl;
for(auto i:a) cout<<i<<' ';
输出
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
pair
pair类似结构体pair<string,int>中的两个元素类型可以不同
在头文件#include<utility>
中。如果代码中已经用到了using namespace std;那么我们就不用再加入头文件以节省资源
pair<int,int> p;
p.first //取p的第一个元素
p.second //取p的第二个元素
支持比较运算,以first为第一关键字,second为第二关键字(字典序)
pair常见用法
pair<int ,string> p;
p=make_pair(3,"asd");
cout<<p.first<<' ';
输出
3
p={6,"sss"};
cout<<p.first<<' '<<p.second<<' ';
输出
6 sss
还可以在pair中嵌套
pair<int,pair<int,int>> p;
p={1,{2,3}};
cout<<p.first<<' ';
cout<<p.second.first<<' ';
cout<<p.second.second<<' ';
输出
1 2 3
string
string a;
a="asd";
a+="zxc";
cout<<a; //asdzxc
substr() //两个参数,第一个是起始地址,第二个是长度。
cout<<a.substr(1,3);
输出
sdz
c_str() //返回首地址
printf("%s",a.c_str());
输出
asdzxc
string 也有size,empty,clear函数
a.size()/a.length() //
a.empty() //
a.clear() //
queue
queue模拟队列,在头文件#include <queue>
,
size()
empty()
queue没有clear函数但可以通过q=queue<int>(); 达到清空的效果
push() //向队尾插入一个元素
pop() //删除队头元素
front() //返回队头元素
back() //返回队尾元素
queue没有迭代器,所以queue的遍历只能
while(!q.empty())
{
cout<<q.front()<<' ';
q.pop();
}
priority_queue
priority_queue优先队列,默认创建大根堆
push() //插入一个元素
top() //返回堆顶元素
pop() //删除堆顶元素
stack
size() //
empty() //
push() //向栈顶插入
top() //返回栈顶元素
pop() //弹出栈顶元素
deque
deque不仅vector一样适合在尾部添加删除,deque 还擅长在序列头部添加或删除元素,所耗费的时间复杂度也为常数阶O(1)
size() //
empty() //
clear() //
front()/back() //返回队首/返回队尾
push_back()/pop_back() //队尾插入/队尾删除
push_front()/pop_front() //队首插入/队首删除
begin()/end()
[] //随机存储
set
set , map, multiset ,multimap
size()
empty()
clear()
begin()/end()
set/multiset
insert() 插入一个数
find() 查找一个数
count() 统计一个数的出现次数
erase()
参数情况1.输入一个x,删除所有的x
2.输入是迭代器,删除这个迭代器
lower_bound() 返回大于等于x的最小数的迭代器
upper_bound() 返回大于x的最小数的迭代器
map/multimap
insert() //输入的数是pair
erase() //pair或迭代器
find()
[] //时间复杂度是O(logn)
lower_bound()
upper_bound()
unordered_set
与上面类似
但不支持lower_bound() upper_bound()
好处是增删改查的时间复杂度O(1)
bitset
定义:
bitset <个数> 变量名;
支持:
~,&,|,^
>>,<<
==,!=
[]
常用函数:
count(); 返回某一个数的个数
any(); 判断是否至少有一个1
none(); 判断是否全为0
set(); 把所有位置赋值为1
set(k,v); 将第k位变成v
reset(); 把所有位变成0
flip(); 把所有位取反,等价于~
flip(k); 把第k位取反