11.8
基本位运算:
一、求n的二进制位第k位数 n>>k&1
二、返回n的二进制中最后一位1以及后面的0 lobit(n)
int lobit(int x){
return x&-x;
}
11.10
pair 的用法:
定义:pair是将两个数据组合成一组数据,pair的实现其实是一个结构体,既然是将两个数据组合成一个数据,那么里面自然就有两个数据了,我们将其称之为成员变量,分别为first和second。
一:用pair定义一个变量
pair<int,int> name;//两个int的结构类型可以变换
二:用pair定义一种结构体
typedef pair<int,int> PII;//定义一个结构类型为pair的结构体 PII
PII a,b;//表示a和b都是pair类型的
动态数组vector的基本用法:
https://blog.youkuaiyun.com/zq9955/article/details/112597324
基本概况:定义vector对象的时候先不用指定数组的大小,有数据的化就往数组里面插入就可以了。vector内部自己管理存储空间。
定义:
#include<vector>
using namespace std;
vector<int> a;//int类型可以改变
基本操作:
vector<int>arr_int;
①arr_int[idx] 或 arr_int.at(idx) //返回动态数组中下标为idx的arr_int[idx]元素的值
②arr_int.size() ; //返回arr_int数组元素的总个数
③arr_int.front(); //返回arr_int 数组的第一个元素的值
④arr_int.back(); //返回arr_int数组的最后一个元素的值
⑤arr_int.clear(); //清空arr_int数组
⑥arr_int.begin(); //返回arr_int数组的第一个下标
⑦arr_int.end(); //返回arr_int数组最后一个数的下标
⑧arr_int.empty(); //判断arr_int数组是否为空,如果为空返回true,非空返回false
⑨arr_int.swap(v1); //v1是另一个动态数组,将arr_int和v1两个动态数组的元素互换
⑩swap(arr_int,v1); //同⑨
11.13
动态数组的去重操作:
sort(h.begin(),h.end());
h.erase(unique(h.begin(),h.end()),h.end());
步骤一:
先对动态数组h进行排序(sort)
步骤二:
运用库函数unique对其初步去重(unique(h.begin(),h.end())表示将数组h从头到尾里重复的元素放在数组的尾端,其返回值为h数组去重后有序序列的末值下标加一),然后通过
h.erase()来删除h数组末端重复的值。
11.14
栈的基本操作:
s.push(x); //插入元素,x表示要插入的值,什么都行(但是类型必须和定义的相同)
s.pop(); //将栈顶弹出,无返回值
s.empty(); //判断是否是空栈
s.size(); //返回栈中有多少个元素
s.top(); //返回栈顶
s.swap(s2); //交换s和s2里面的值(s2需要和s是一个类型)
单调栈基本思路:
维护栈内元素单调递增或递减
队列的基本操作:
q.front(); //获取队首
q.back(); //获取队尾
q.push(x); //插入元素,x表示要插入的值,什么都行(但是类型必须和定义的相同)
q.pop(); //将队头弹出,无返回值
q.size(); //返回队列里有多少个元素
q.empty(); //如果队列为空,返回true,否则返回false( 等同于q.size()==0 )
q.swap(q2); //交换q和q2里面的值(q2需要和q是一个类型)
双向队列:
双向队列不仅可以在队尾插入,在队头删除,还可以在队头插入,在队尾删除,还支持下标访问
#include<deque>
deque<typename> 双向队列名字;
基本操作 :
q.push_front(x); //在队头插入元素,x表示要插入的值,什么都行(但是类型必须和定义的相同)
q.push_back(x); //在队尾插入元素,x表示要插入的值,什么都行(但是类型必须和定义的相同)
q.pop_front(); //将队头弹出,无返回值
q.pop_back(); //将队尾弹出,无返回值
q.front(); //和queue的一样
q.back(); //和queue的一样
q.size(); //和queue的一样
q.empty(); //和queue的一样
q.swap(q2); //和queue的一样
q[i] //获取第i个元素(队头是第0个)
q.at(i); //同上(不同的地方很少)
q.clear(); //清空双向队列
q.begin(); //获取首地址,返回迭代器 (待会说怎么用)
q.end(); //获取位地址+1 注意!还要加1
还有很多......
11.25
unsigned 类型
unsigned是指的有符号 即有负数 ,unsigned是无符号的 即没有负数
unsigned是默认的 显示指定unsigned 为了扩大类型范围
即int类型大小范围是-32768——32767
而unsigned int 是0 - 65535 32767+32768
unsigned long long 类型
是一个64位的类型,溢出则代表对2的64次方取余。
unsigned long long
就是2^64
范围,所以我们用其存储,可以起到同样的效果,溢出自动取模。