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;
}
快速幂(带快速乘法)

相关文章: