模板库

read()+print()

inline int read() {
    char ch;
    bool bj=0;
    while(!isdigit(ch=getchar()))
        bj|=(ch==‘-‘);
    int res=ch^(3<<4);
    while(isdigit(ch=getchar()))
        res=(res<<1)+(res<<3)+(ch^(3<<4));
    return bj?-res:res;
}
void printnum(int x) {
    if(x>9)printnum(x/10);
    putchar(x%10+‘0‘);
}
inline void print(int x,char ch) {
    if(x<0) {
        putchar(‘-‘);
        x=-x;
    }
    printnum(x);
    putchar(ch);
}

fread()     From Internet

struct ios{
    inline char read(){
        static const int IN_LEN=1<<18|1;
        static char buf[IN_LEN],*s,*t;
        return (s==t)&&(t=(s=buf)+fread(buf,1,IN_LEN,stdin)),s==t?-1:*s++;
    }
    template <typename _Tp> inline ios & operator >> (_Tp&x){
        static char c11,boo;
        for(c11=read(),boo=0;!isdigit(c11);c11=read()){
            if(c11==-1)return *this;
            boo|=c11==‘-‘;
        }
        for(x=0;isdigit(c11);c11=read())x=x*10+(c11^‘0‘);
        boo&&(x=-x);
        return *this;
    }
}io;

基础模板

高精度+重载运算符     From Internet

const int MAX=100;
struct node {
    int num[MAX];
    node & operator = (const char*);
    node & operator = (int);
    node();
    node(int);
    bool operator > (const node &) const;
    bool operator < (const node &) const;
    bool operator <= (const node &) const;
    bool operator >= (const node &) const;
    bool operator != (const node &) const;
    bool operator == (const node &) const;
    node operator + (const node &) const;
    node operator - (const node &) const;
    node operator * (const node &) const;
    node operator / (const node &) const;
    node operator % (const node &) const;
    node & operator += (const node &);
    node & operator -= (const node &);
    node & operator *= (const node &);
    node & operator /= (const node &);
    node & operator %= (const node &);
};
node & node::operator = (const char* c) {
    memset(num,0,sizeof(num));
    int n=strlen(c),j=1,k=1;
    for (int i=1; i<=n; i++) {
        if (k==10000) j++,k=1;
        num[j]+=k*(c[n-i]-‘0‘);
        k*=10;
    }
    num[0]=j;
    return *this;
}
node & node::operator = (int a) {
    char s[MAX];
    sprintf(s,"%d",a);
    return *this=s;
}
node::node() {
    memset(num,0,sizeof(num));
    num[0]=1;
}
node::node (int n) {
    *this = n;
}
bool node::operator > (const node &b) const {
    if (num[0]!=b.num[0]) return num[0]>b.num[0];
    for (int i=num[0]; i>=1; i--)
        if (num[i]!=b.num[i])
            return (num[i]>b.num[i]);
    return false;
}
bool node::operator < (const node &b) const {
    return b>*this;
}
bool node::operator <= (const node &b) const {
    return !(*this>b);
}

bool node::operator >= (const node &b) const {
    return !(b>*this);
}

bool node::operator != (const node &b) const {
    return (b>*this)||(*this>b);
}

bool node::operator == (const node &b) const {
    return !(b>*this)&&!(*this>b);
}
node node::operator + (const node &b) const {
    node c;
    c.num[0] = max(num[0], b.num[0]);
    for (int i=1; i<=c.num[0]; i++) {
        c.num[i]+=num[i]+b.num[i];
        if (c.num[i]>=10000) {
            c.num[i]-=10000;
            c.num[i+1]++;
        }
    }
    if (c.num[c.num[0]+1]>0) c.num[0]++;
    return c;
}
node node::operator - (const node &b) const {
    node c;
    c.num[0] = num[0];
    for (int i=1; i<=c.num[0]; i++) {
        c.num[i]+=num[i]-b.num[i];
        if (c.num[i]<0) {
            c.num[i]+=10000;
            c.num[i+1]--;
        }
    }
    while (c.num[c.num[0]]==0&&c.num[0]>1) c.num[0]--;
    return c;
}
node & node::operator += (const node &b) {
    return *this=*this+b;
}

node & node::operator -= (const node &b) {
    return *this=*this-b;
}
node node::operator * (const node &b) const {
    node c;
    c.num[0] = num[0]+b.num[0]+1;
    for (int i=1; i<=num[0]; i++) {
        for (int j=1; j<=b.num[0]; j++) {
            c.num[i+j-1]+=num[i]*b.num[j];
            c.num[i+j]+=c.num[i+j-1]/10000;
            c.num[i+j-1]%=10000;
        }
    }
    while (c.num[c.num[0]]==0&&c.num[0]>1) c.num[0]--;
    return c;
}
node & node::operator *= (const node &b) {
    return *this=*this*b;
}
node node::operator % (const node &b) const {
    node c, d;
    c.num[0] = num[0]+b.num[0]+1;
    d.num[0] = 0;
    for (int i=num[0]; i>=1; i--) {
        memmove(d.num+2, d.num+1, sizeof(d.num)-sizeof(int)*2);
        d.num[0]++;
        d.num[1]=num[i];
        int left=0, right=9999, mid;
        while (left < right) {
            mid = (left+right)/2;
            if (b*node(mid) <= d) left=mid+1;
            else right=mid;
        }
        c.num[i]=right-1;
        d=d-b*node(right-1);
    }
    while (c.num[c.num[0]]==0&&c.num[0]>1) c.num[0]--;
    return d;

}
node & node::operator /= (const node &b) {
    return *this=*this/b;
}

node & node::operator %= (const node &b) {
    return *this=*this%b;
}
node node::operator / (const node& b) const {
    node c, d;
    c.num[0] = num[0]+b.num[0]+1;
    d.num[0] = 0;
    for (int i=num[0]; i>=1; i--) {
        memmove(d.num+2, d.num+1, sizeof(d.num)-sizeof(int)*2);
        d.num[0]++;
        d.num[1]=num[i];
        int left=0, right=9999, mid;
        while (left < right) {
            mid = (left+right)/2;
            if (b*node(mid) <= d) left=mid+1;
            else right=mid;
        }
        c.num[i]=right-1;
        d=d-b*node(right-1);
    }
    while (c.num[c.num[0]]==0&&c.num[0]>1) c.num[0]--;
    return c;
}
ostream & operator << (ostream & o, node &n) {
    o<<n.num[n.num[0]];
    for (int i=n.num[0]-1; i>=1; i--) {
        o.width(4);
        o.fill(‘0‘);
        o<<n.num[i];
    }
    return o;
}
istream & operator >> (istream & in, node &n) {
    char s[MAX];
    in>>s;
    n=s;
    return in;
}

排序算法

归并排序

void Div(int l,int r){
    if(l==r)return;
    int mid=(l+r)>>1;
    Div(l,mid);
    Div(mid+1,r);
    int i=l,j=mid+1,p=l;
    while(i<=mid&&j<=r)
        if(a[i]<a[j])tmp[p++]=a[i++];
            else tmp[p++]=a[j++];
    while(i<=mid)tmp[p++]=a[i++];
    while(j<=r)tmp[p++]=a[j++];
    for(int i=l;i<=r;i++)a[i]=tmp[i];
}

快速排序

sort(a+1,a+n+1);
sort(a+1,a+n+1,greater<int>());

离散化

inline void Dcz(){
    for(int i=1;i<=n;i++)tmp[i]=a[i];
    sort(tmp+1,tmp+n+1);
    newn=unique(tmp+1,tmp+n+1)-tmp-1;
    for(int i=1;i<=n;i++)a[i]=lower_bound(tmp+1,tmp+newn+1,a[i])-tmp;
}

数据结构

前缀和

一维

inline int cal(int x,int y){
    return sum[y]-sum[x-1];
}
int main(){
    for(int i=1;i<=n;i++){
        a[i]=read();
        sum[i]=sum[i-1]+a[i];
    }
    return 0;
}

二维

#define y1 Sol_y1
#define y2 Sol_y2
inline int ask(int x1,int y1,int x2,int y2) {
    return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
}
int main(){
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) {
            a[i][j]=read();
            sum[i][j]=sum[i-1][j]+sum[i][j-1]+a[i][j]-sum[i-1][j-1];
        }
    return 0;
}

二叉堆

手工堆(小根)

inline void heapdown(){
    int i,j;
       i=1;
       while((i<<1)<=a[0]){
           if((i<<1)==a[0]||a[i<<1]<a[i<<1|1])j=i<<1;
           else j=i<<1|1;
              if(a[i]>a[j]){
            swap(a[i],a[j]);
            i=j;
        }
           else break;
       }
}
inline void heapup(){
    int i=a[0];
      while(i>1&&a[i]<a[i>>1]){
        swap(a[i],a[i>>1]);
        i>>=1;
    }
}
inline void Insert(int x){
    a[++a[0]]=x;
    heapup();
}
inline void Delete(){
    a[1]=a[a[0]];
       a[0]--;
       heapdown();
}

STL

#include<queue>
priority_queue<int>q//大根堆
priority_queue<int,vector<int>,greater<int> >q//小根堆

并查集

路径压缩

int GetFather(int x){
    return x==prt[x]?x:prt[x]=GetFather(prt[x]);
}
inline void Union(int x,int y){
    prt[GetFather(x)]=GetFather(y);
}
inline bool query(int x,int y){
    return GetFather(x)==GetFather(y);
}
int main(){
    //
    for(int i=1;i<=n;i++)prt[i]=i;
    //
    return 0;
}

按秩合并

int GetFather(int x){
    return x==prt[x]?x:GetFather(prt[x]);
}
inline void Union(int x,int y){
    int f1=GetFather(x),f2=GetFather(y);
    if(f1==f2)return;
    if(size[f1]>size[f2])prt[f2]=f1,size[f1]+=size[f2];
    else prt[f1]=f2,size[f2]+=size[f1];
}
inline bool query(int x,int y){
    return GetFather(x)==GetFather(y);
}
int main(){
    //
    for(int i=1;i<=n;i++)prt[i]=i,size[i]=1;
    //
    return 0;
}

原文地址:https://www.cnblogs.com/soledadstar/p/11516568.html

时间: 2024-11-19 02:04:18

模板库的相关文章

标准模板库

-------------------siwuxie095 在长期的编码中,聪明的程序员们发现:有一些代码经常碰到, 而且需求特别稳定,于是,各大公司在出售自己的 IDE 环境时, 就会把这些模板代码打包,一起销售 慢慢地,这些大公司之间就达成了某种共识,觉得应该把这些 涉及模板的通用代码进一步的统一和规范,于是,大家慢慢形 成了一套 C++ 的标准模板,就是现在所看到的标准模板库 标准模板库 标准模板库,即 Standard Template Lib,简称为 STL 标准模板库所涉及的内容非常

C++模板引出的标准模板库-----&gt;初涉

C++中模板,是相当重要的一部分,前面提到过一些基础,关于模板中需要注意的问题,会在最近整理出来,今天想说的,是由模板引出的标准模板库. 当初经常会被推荐看<STL源码剖析>这本书,听说很厉害,是C++高手都需要走过的路,可一直都不知道STL是什么,也一直忘记去查,今天整理出来的一些东西,最起码可以让未了解过这方面的童鞋认识一下. C++标准模板库,即STL:Standard Template Lib,STL的产生,是必然的.在长期的编码过程中,一些程序员发现,有一些代码经常用到,而且需求特别

C++标准库和标准模板库

C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义. 在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括: (1)成本:已经作为标准提供,何苦再花费时间.人力重新开发呢: (2)质量:标准库的都是经过严格测试的,正确性有保证: (3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平: (4)良好的编程风格:采用行业中普遍的做法进行开发. 一.C++标准库 C++标准库的内容分为10类, 分别是:C1.语

STL学习一:标准模板库理论基础

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),容器和算法通过迭代器可以进行无缝 地连接.几乎所有的代码都采 用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会.在C++标准中,STL被组织为下面的13个头文

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对

C++ Primer 学习笔记_23_标准模板库_stack.

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

C++ Primer Plus 第六版 第16章 string类和标准模板库

1.string实际上是模板具体化basic_string<char> 的一个typedef,有默认参数,所以省略了初始化参数 2.size_type是一个依赖于实现的整形 string将string::npos定义为字符串的最大长度 3.string类的构造函数P656 4.对于c-风格字符串,3种输入方法:cin>>   cin.getline(),cin.get 对于string   ,2种输入方法:cin>>,getline(cin,string对象) 5.st

实验8 标准模板库STL

一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http://acm.hpu.edu.cn/contest.php?cid=1020,密码c++08,共有5道题.将答题过程简单记录到实验过程中. 将答题结果写到实验结果中,并根据答题结果进行分析.反思,将其写到实验分析中,并写上实验时间.

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类

C++标准模板库学习。。。

作为C++标准库相当重要的一部分,STL库提供一系列组件操作.它主要可以分为容器.迭代器.基本算法.函数对象以及内存分配器和配接器六个部分.整个STL库的代码都采用模板函数以及模板类的方式实现,具有高度的通用性.对于传统的应用程序来讲,模板库支持并且倡导一种新的编程风格,即称为泛型编程思想,以通用的模板方式来编写应用程序中的数据结构与算法. 16.1  STL常见容器 C++标准STL库中封装实现了常见数据结构,并以容器的方式提供给用户使用.STL容器主要包含vector向量.deque队列.l