位运算及标准模版库(c++)

位运算及标准模版库
一、位运算
二、vector
三、stack
四、queue和priority_queue
五、map和pair
六、set
七、string
八、algorithm

位运算及标准模版库

一、位运算

1、位运算符

这些位运算只能用于整型操作数,即只能用于带符号或无符号的char、short、int、与long类型。

①按位与(&)
②按位或(|)
③按位异或(^)
④取反(~)
⑤左移(<<)n<<1=2*n,1<<n=2^n
⑥右移(>>)n>>1=n/2
优先级:
加减   移位    比较大小     位与   异或   位或
+,-    <<,>>   >,<,==,!=     &      ^      | 

2、位运算的应用举例

①高效代替布尔型数组
②表示集合、搜索算法中的状态判重(hash)
③动态规划算法中的状态压缩

二、vector

使用vector,需添加#include,同时要有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,同时要有using namespace std。

1、定义:

stack<typename> name;//typename可以是任何基本类型或者容器,name是栈的名字

2、常用函数

push()
push(x)用来将x压栈

②top()
获得栈顶元素

③pop()
弹出栈顶元素

④empty()
检测stack是否为空,空返回true,否则返回falsesize()
返回stack内元素个数

只能通过函数top()和pop()来访问栈顶元素。

四、queue和priority_queue

queue

queue翻译为队列,是一个”先进先出“的容器。使用时需添加include,同时要有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,同时要有using namespace std。

1、定义

priority_queue<typename> name;

和queue不一样的是,priority_queue没有front()和back(),而只能通过top()或pop()访问队首元素(也称堆顶元素),也就是优先级最高的元素。

2、常用函数

push()
push(x)是将x加入优先队列

②top()
获得队首元素(堆顶元素)

③pop()
让队首元素(堆顶元素)出队

使用top()必须用empty()判断优先队列是否为空,否则有可能出错。

3、元素优先级的设置

优先队列对它们的优先级设置一般是数字越大的优先级越高(对于char,则是字典序最大的)。
以下两种优先队列的定义是等价的:

priority_queue<int> q;
priority_queue<int,vector<int>,less<int>> q;

五、map和pair

map

map翻译为映射。使用时需添加include,同时要有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,同时要有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,同时要有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,同时要有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,必须要有using
namespace std。

1max(),min(),abs(),swap()
2reverse():reverse(it,it2)可以将数组指针在it~it2(左闭右开区间)之间的元素,或容器的迭代器在it~it2范围内的所有元素进行反转。
3next_permutation():求出一个序列在全排列中的下一个序列。
4fill():可以把数组或容器的某一段区间赋值为某个相同的值
fill(a,a+5,123);//将a[0]到a[4]均赋值为123
5sort():实现排序的函数
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()的。

本文借鉴 acwing中 2019/05/10位运算及标准模版库 作者:卬岇昂 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值