位运算及标准模版库
位运算
- 1、位运算符
这些位运算只能用于整型操作数,即只能用于带符号或无符号的char、short、int、与long类型。
①按位与(&)
②按位或(|)
③按位异或(^)
④取反(~)
⑤左移(<<)n<<1=2*n,1<<n=2^n
⑥右移(>>)n>>1=n/2
优先级:
加减 移位 比较大小 位与 异或 位或
+,- <<,>> >,<,==,!= & ^ |
- 2、位运算的应用举例
①高效代替布尔型数组
②表示集合、搜索算法中的状态判重(hash)
③动态规划算法中的状态压缩
vector
使用vector,需添加
#include<vector>
,同时要有using namespace std。
- 1、定义
vector<typename> name;
vector<int> a;//长度不固定的一维整型数组
vector<double> b;//长度不固定的一维浮点型数组
vector<node> student;//node为已经定义了的结构体
vector<int> c[100];//一维长度固定为100,另一维长度不固定的二维数组,
vector<vector<int> > a;//一个两位长度都不固定的二维数组
- 2、访问
①下标访问:对于vector<int> v,使用v[idx]访问它的第idx个元素
0<=idx<=v.size()-1,v.size()表示vector中元素个数
②迭代器访问:定义:
vector<typename>::iterator it;
可以通过*it来访问vector里的元素。迭代器也可以进行自加、自减操作。
v.begin()为取v的首元素地址,v.end()为取尾元素地址的下一个地址。
- 3、常用函数
①push_back()
push_back(X)在vector后添加一个元素x。
②size()
一维:vector中元素个数
二维:vector中第二维元素个数
用resize(n)重设数组大小
③pop_back()
删除vector的尾元素
④clear(n)
清空vector中的所有元素
⑤insert()
insert(it,x)用来向vector任意迭代器it处插入一个元素x
⑥erase()
erase(it):删除it处元素
earse(left right):删除[left,right)内所有元素
stack
stack翻译为栈,是一个”后进先出“的容器。使用时需添加
include<stack>
,同时要有using namespace std。
- 1、定义:
stack<typename> name;//typename可以是任何基本类型或者容器,name是栈的名字
- 2、常用函数
①push()
push(x)用来将x压栈
②top()
获得栈顶元素
③pop()
弹出栈顶元素
④empty()
检测stack是否为空,空返回true,否则返回false
⑤size()
返回stack内元素个数
- 只能通过函数
top()
和pop()
来访问栈顶元素。
queue和priority_queue
queue
queue翻译为队列,是一个”先进先出“的容器。使用时需添加
include<queue>
,同时要有using namespace std。
- 1、定义
queue<typename> name;
- 2、常用函数
①push()
push(x)用来将x入队
②front()
获得队首元素
③back()
获得队尾元素
④pop()
让队首元素出队
⑤empty()
检测queue是否为空
⑥size()
返回queue内元素的个数
- queue只能通过函数
front()
来访问队首元素,或通过函数back()
来访问队尾元素。一般应用在宽搜中。在使用front()
和pop()
前,必须用empty()
判断队列是否为空,否则可能因为队空而出现错误。
priority_queue
priority_queue翻译为优先队列,一般用来解决一些贪心问题,其底层是用“堆”来实现的。使用时需添加
include<queue>
,同时要有using namespace std。
- 1、定义
priority_queue<typename> name;
- 和queue不一样的是,priority_queue没有
front()
和back()
,而只能通过top()
或pop()
访问队首元素(也称堆顶元素),也就是优先级最高的元素。 - 2、常用函数
①push()
push(x)是将x加入优先队列
②top()
获得队首元素(堆顶元素)
③pop()
让队首元素(堆顶元素)出队
- 使用top()必须用empty()判断优先队列是否为空,否则有可能出错。
- 2、元素优先级的设置
优先队列对它们的优先级设置一般是数字越大的优先级越高(对于char,则是字典序最大的)。
以下两种优先队列的定义是等价的:
priority_queue<int> q;
priority_queue<int,vector<int>,less<int>> q;
map和pair
map
map翻译为映射。使用时需添加
include<map>
,同时要有using namespace std。
map的用途有以下情形:
①需要建立字符(串)与整数之间的映射,使用map可以减少的代码量。
②判断大整数(比如几千位)或者其他类型数据是否存在,可以把map当布尔型数组使用(哈希表)。
③字符串与字符串之间的映射。
定义一个map的方法如下:
map<typename1,typename2> name;//typename1是映射前的类型(键key),typename2是映射后的类型(值value),name为映射的名字。
map<int,int> a;
map<string,int> a;//不能使用char
map<set<int>,string>mp;
- 1、访问
①通过下标访问:
先定义“map<char,int> mp”,然后就可以通过mp['c']的方式来访问它对应的元素。
- 2、常用函数
①find()
find(key)是返回键为key的映射的迭代器。
②size()
size()获得map中映射的对数。
③erase()
删除单个元素:
erase(it):it为要删除的元素的迭代器
erase(key):key为要删除的映射的键
删除一个区间的所有元素:
erase(left,right):删除[left,right)内所有元素
④clear()
清空map
pair
pair是“二元结构体”的替代品。使用时需添加
include<utility>
,同时要有using namespace std。
- 定义
pair<typename1,typename2> name;
相当于:
struct pair{
typename1 first;
typename2 second;
}
pair<string,int> p;make_pair("haha",5);
pair<string,int> p("haha",5);
- pair可以直接做比较运算,比较规则是先以first的大小作为标准,只有当first相等时才去判断second的大小。
- 所以,pair可以作为map的键值对来插入(排序)。
set
set翻译为集合,是一个内部自动有序且不含重复元素的容器。使用时需添加
include<set>
,同时要有using namespace std。
- 1、定义
set<typename> name;
set<int> st;
set<int> st[100];
set只能通过迭代器访问。
定义迭代器:
set<typename>::iterator it;
然后使用*it来访问set中的元素。
set不支持*(it+i),it<st.end()的访问方式。
- 2、常用函数
①insert()
insert(x)用来将x插入到set中,并自动递增排序和去重。
②size()
获得set中的元素个数
③find()
find(value)是返回set中对应值为value的迭代器
④clear()
清空set中的所有元素
④erase()
删除单个元素:
erase(it):it为要删除元素的迭代器
earse(value):value为要删除的元素的值
删除一个区间的所有元素:
erase(left,right):删除[left,right)内所有元素
string
使用时需添加
include<string>
,同时要有using namespace std。
* 定义
string name;
- 1、访问
①像普通字符数组一样操作
②通过迭代器
定义迭代器:
string::iterator it;
然后就可以通过*it来访问string里的每一个元素。
- 2、运算
加法:把两个字符串直接拼接起来。
关系:按照字典序比较两个string类型的大小。
- 3、常用函数
①length()
返回string的长度(字符个数)
②size()
与length()一样
③clear()
用来清空string中的所有元素
④substr()
substr(pos,len)返回从pos号位置开始、长度为len的子串
⑤insert()
insert(pos,string):在pos号位置插入字符串string
insert(it,it2,it3):it为原字符串的欲插入位置;it2和it3为待插入字符串的首尾迭代器(左毕右开区间)
⑥erase()
删除单个元素:
erase(it):it为要删除元素的迭代器
删除一个区间内的所有元素:
erase(left,right):删除[left,right)中的所有元素
erase(pos,length):pos为需要删除的字符串起始位置;length为要删除的字符个数
⑦find()
str.find(str2):当str2是str的子串时,返回其在str中第一次出现的位置;否则,返回string::npos
string::npos是一个常数,其本身的值等于-1
str.find(str2,pos):从str的pos号位开始匹配str2,返回值同上
⑧replace()
str.replace(pos,len,str2):把str从pos号位开始、长度为len的子串替换为str2
str.replace(it1,it2,str2):把str的迭代器it1~it2范围内(左闭右开区间)的子串替换为str2
algorithm
algoriyhm翻译为算法提供了大量基于迭代器的非成员模版函数。要使用这些函数,需要添加
#include<algorithm>
,必须要有using namespace std。
- 1、
max(),min(),abs(),swap()
- 2、
reverse()
:reverse(it,it2)
可以将数组指针在it~it2(左闭右开区间)之间的元素,或容器的迭代器在it~it2范围内的所有元素进行反转。 - 3、
next_permutation()
:求出一个序列在全排列中的下一个序列。 - 4、
fill()
:可以把数组或容器的某一段区间赋值为某个相同的值
fill(a,a+5,123);//将a[0]到a[4]均赋值为123
- 5、
sort()
:实现排序的函数
sort(首元素地址,尾元素地址的下一地址,比较函数);//前两个必填,没有比较函数表示堆区间元素进行递增排序
如果要实现递减排序,或者对结构体(本身没有大小关系)等进行排序,就需要用到比较函数,一般写成cmp()函数。
递减排序:
bool cmp(int a,int b){
return a>b;
}
结构体按照x从大到小排列:
bool cmp(node a,node b){
return a.x>b.x;
}
- 在STL标准容器中,只有vector、string、deque是可以用sort()的。
赞
谢谢辽
好棒啊.清晰明了.%%%
因为对这些不太懂,所以就系统地整理了一遍啦
(๑•̀ㅂ•́)و✧