C++语言和STL库操作
重载运算符操作
/* 重载运算符 格式 如重载小于号 这里是以x递减为第一关键字比较,y递减为第二关键字比较 */ bool operator < (node a,node b){ if (a.x!=a.y) return a.x<b.x; else return a.y<b.y; }
算法类:
sort
/* sort的用法 sort(数组首位地址 ,数组末尾地址 , 比较函数) 比较函数同时可替换为重载小于号运算符 (一般采用比较函数true返回,就是保持这种趋势) 下面是一个实例,以x为第一关键字递减、以y为第二关键字递减排序 */ struct rec{ int x,y;}; bool cmp(rec a,rec b) { if (a.x!=b.x) return a.x<b.x; else return a.y<b.y; } sort(a+1,a+1+n,cmp);
swap
/* 交换两个格式相同的元素,如 int a=1,b=2; swap(a,b)完成后a=2,b=1 下面是一个清空queue的swap实现 */ void clear(queue<int> &q) { queue<int>empty; swap(q,empty); }
next_permutation
/* 求下个排列,按照字典序, next_permutation(首地址,末地址) 返回0表示已经是最后一个字典序了否则返回1 下面给出求n全排列的实现. */ # include <bits/stdc++.h> using namespace std; int main() { int n; scanf("%d",&n); int a[10]; for (int i=1;i<=n;i++) a[i]=i; do { for (int i=1;i<=n;i++) printf("%d ",a[i]); puts(""); } while (next_permutation(a+1,a+1+n)); }
max,min
/* 支持两个相同类型的元素进行比较,可以重载小于号, 取在<意义下的较小值 调用实现 */ Max=max(a,b); Min=min(a,b);
容器类:
list 双端链表
定义: list<int>lt; .begin() 返回开始 .end() 返回结束的后一个 .push_back()/.push_front() 尾部头部插入 .empty() 判断list是不是为空 .clear() 清空 .pop_back()/.pop_front() 尾部/头部删除 a.merge(b) 调用结束后b为空,a中元素包括b .insert(pos,val) pos位置插入一个或多个元素 .earse(l,r) 删除l到r所有元素 .remove(x) 删除所有元素x
bitset
定义一个bitset bitset<16> f(string("0101111001")); 按照普通计算,可以执行& | ^ << >>等操作 .count()返回1的个数 .set(p) p+1位变成1 .set(p,x) p+1位变成x .plip(p) p+1位取反 .to_ullong 转化为unsigned long long类型 .to_string 转化为string类型
stack
定义:stack<int>stt; stack 的用法 .empty() 堆栈为空则返回真 .pop() 移除栈顶元素(不会返回栈顶元素的值) .push() 在栈顶增加元素 .size() 返回栈中元素数目 .top() 返回栈顶元素
queue deque priority_queue(重载优先级)
priority_queue 优先队列 定义: /*下面两种优先队列的定义是等价的(默认)*/ priority_queue<int> q; priority_queue<int,vector<int>,less<int> > q;//大根堆 /*这一种写法与上面不等价,恰好相反*/ priority_queue<int,vectot<int>,greater<int> > q; //小根堆 重载小于号: struct rec{ int x,y; bool operator < (rec other){ if (x!=other.x) return x<other.x; else return y<other.y; } }; struct cmp{ bool operator () (rec a,b){ if (a.x!=b.x) return a.x<b.x; else return a.y<b.y; } }; priority_queue<rec,vector<rec>,cmp>q;//按照a.x和a.y为第一关键字大根堆 , 基本操作: .top() 访问堆顶元素 .push() 插入一个新元素 .pop() 删除堆顶元素 .empty() 是否为空 .size() 堆中元素个数
vector
vector的用法 定义:vector<int>a; 用法: .back(); 返回a的最后一个元素 .front(); 返回a的第一个元素 .push_back(); 插入一个元素 a[i]; 返回a的第i个元素,当且仅当a[i]存在 .erase(a.begin()+1,a.begin()+3); 删除a中第1个(从第0个算起)到第2个元素也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它) .pop_back(); 删除a向量的最后一个元素 .clear(); 清空a中的元素 .empty(); 判断a是否为空,空则返回ture,不空则返回false .swap(b); b为向量,将a中的元素和b中的元素进行整体性交换 .find(a.begin(),a.end(),10); 在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
map
定义map<int,int>mp;//从int映射到int 用法: begin() 返回指向map头部的迭代器 clear() 删除所有元素 count() 返回指定元素出现的次数 empty() 如果map为空则返回true end() 返回指向map末尾的迭代器 erase() 删除一个元素 find() 查找一个元素 insert() 插入元素 lower_bound() 返回键值>=给定元素的第一个位置 upper_bound() 返回键值>给定元素的第一个位置 size() 返回map中元素的个数
set 和 multiset
set 和 multiset 定义set<int>st; //定义一个int 不可重复集合 定义multiset<int>st;//定义一个int 可重集 (删除的时候同时删除一样的) begin() 返回指向第一个元素的迭代器 clear() 清除所有元素 count() 返回某个值元素的个数 empty() 如果集合为空,返回true end() 返回指向最后一个元素的迭代器 erase() 删除集合中的元素 find() 返回一个指向被查找到元素的迭代器 insert() 在集合中插入元素 lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器 upper_bound() 返回大于某个值元素的迭代器 size() 集合中元素的数目
迭代器iterator的格式写法
/* 这里以遍历vector为例子,其他遍历同理 */ vector<int>::iterator it; for (it=a.begin();it!=a.end();++it) printf("%d ",*it);
基础数论模板
快速幂(乘)
int mul(int x,int n,int p) { int ans=0; while(n) { if (n&1)ans=ans+x%p; x=x+x%p; n>>=1; } return ans%p; } int fpow(int x,int n,int p) { int ans=1; while (n) { if (n&1) ans=mul(ans,x,p); x=mul(x,x,p); n>>=1; } return ans%p; }