STL
STL
扩容
倍增
倍增定义 倍增法(英语:binary lifting),顾名思义就是翻倍。它能够使线性的处理转化为对数级的处理,大大地优化时间复杂度。
cin>>n>>m; lg[1]=0;
for (int i=2;i<=n;i++)
lg[i]=lg[i>>1]+1;
for (int i=1;i<=n;i++)
cin>>f[i][0];
for (int j=1;j<=lg[n];j++)
for (int i=1;i<=n-(1<<j)+1;i++)
{
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
for (int i=1;i<=m;i++)
{
cin>>x>>y;
int l=lg[y-x+1];
cout<<max(f[x][l],f[y-(1<<l)+1][l])<<endl;
}
string
初始化
string str;
string str(s); //str是s的副本
string str(s,2,5); //指定s从2到5初始化
string str(s.begin(),s.end());//使用迭代器初始化
迭代器
定义
string::iterator itr;
string::const_iterator citr;
赋值
vec.begin();
vec.end();
vec.rend();
vec.rebgin();
容量
字符串长度:size和length
判读字符串是否为空:empty
修改
赋值
s2.assign(s1);
s2.assign(s1,6,3);//将s1从下表为6开始赋值长度为3
s2.assign(s1,2,s1.npos);//s1.npos为一个静态常量,表示字符串结尾处。
vector
操作
push_back:尾部插入元素(扩容原理倍增)。
pop_back:尾部删除元素。
resize:重置容器大小,不会重置原有元素。
swap:本质是换了指针,可以理解为给两容器互换名字。高效 的清空一个容器和一个空容器。
clear:删除全部元素。
应用
存图 : 拓扑排序,dp
deque, queue和priority_queue
deque(双端列队)
push_back:尾插
push_front:头插
pop_front:头删
pop_back:尾删
empty:判断元素是否为空
top:取出堆顶
pop:删除堆顶
queue(列队)
push:尾插
pop:头删
empty:判断元素是否为空
back:队尾元素
front:队头元素
priority_queue(优先列队)
push:尾插
top:取出堆顶
pop:删除堆顶
priority_queue<int> q;//默认大堆顶
priority_queue<int,vector<int>,less<int>>//大堆顶
priority_queue<int,vector<int>,greater<int>>//小堆顶
自定义类型
struct node
{
int x,y;
}
方法一:重载operator<
bool operator<(node a,node b)
{
if(a.x==b.x) return a.y>b.y;
return a.x>b.x;
}
priority_queue<node> q;
方法二:自定义cmp
struct cmp1{
bool operator()(node a,node b)
{
if(a.x==b.x)return a.y>b,y;
return a.x>b.x;
}
}
struct cmp2{
bool operator()(node a,node b)
{
if(a.x==b.x)return a.y<b,y;
return a.x<b.x;
}
}
priority_queue<node,vector<node>,cmp1> q;
set 和multiset
set(不允许重复元素)
erase:删除点
instrea:插入点
lower_bound(x):求第一个大于等于x的值的迭代器
upper_bound(x):求第一个大于x的迭代器(如果没有返回最后一个元素的迭代器)
find(x):返回x的迭代器,如果没有 返回end();
求集合最小值:*.begin() 最大值:*.rbegin()
multiset(允许重复元素)
.find(x):返回x的一个迭代器,若有多个返回第一个。
erase(iterator):删除这个迭代器指向的元素
erase(value):将值为value的这些元素均删除
pair map和multimap
pair
pair<int,int> p;
p.first
p.second
map
map是STL的一个关联容器,它提供一对一的hash。
第一个可以称为关键字(key),每个关键字只能在map中出现一次;
第二个可能称为该关键字的值(value);
map<int,int> mp;
mp[key]=value;
put(key,value)
insert:插入元素
clear:移除map里所有的映射关系
get(key):查询key对应的value值
isEmpyt:判断map集合是否为空
remove(key):利用key删除map集合中的元素
keySet():获取所有的key值
values:获取所有的value值
.find(key):所查找的key出现时,返回对象所在位置
multimap
multimap容器中可以同时存储多个键相同的键值对。
底层实际为pair
通过迭代器进行访问
multimap<key,value> mmp;
mmp.insert(make_pair(first,second));
count(key):当前key键值对的个数

浙公网安备 33010602011771号