常用STL模板

 1.vector

相当于动态数组

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(2);//将2添加到尾部并且尾部扩张1
    v.push_back(7);
    v[1]=5;//不扩张尾部;可能报错
    v.push_back(9);
    v.insert(v.begin(),8);//在v.begin()前面插入
    v.insert(v.end(),10);
    v.erase(v.begin(),v.begin()+2);//删除区间内的值
    //v.clear();//删除所有元素
    reverse(v.begin(),v.end());//反向排列
    sort(v.begin(),v.end());//自带排序
    vector<int>::iterator it;
    for(it=v.begin();it<v.end();it++) cout<<*it<<" ";//迭代器访问元素
    cout<<endl;
    if(!v.empty()) cout<<v.size()<<endl;//size返回元素个数,empty返回是否为空
    return 0;
}

2.string

常用的字符串处理
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int main()
{
    string s;
    s="hello,c++stl";//赋值
    cout<<s<<endl;

    char ss[5000];
    scanf("%s",&ss);
    s=ss;//将整个字符数组赋值给string对象
    cout<<s<<endl;

    s=s+"   hiahia";//在尾部添加字符方法1
    cout<<s<<endl;

    s.append("hia");//在尾部添加字符方法2
    cout<<s<<endl;

    string::iterator it;
    it=s.begin();
    s.insert(it,'5');//在迭代器位置之前插入一个字符
    cout<<s<<endl;

    cout<<s[5]<<endl;//下标访问元素

    s.erase(it,it+2);//删除0~2的元素
    s.erase(it+3);//删除第三个元素

    if(!s.empty()) cout<<s.length()<<endl;//若字符串不空则输出字符串长度

    s.replace(3,3,"good");//从第三个字符开始将连续的三个字符替换为“good”
    cout<<s<<endl;

    cout<<s.find("hia")<<endl;//返回子串的第一个下标值

    cout<<s.compare("sjh")<<endl;//s和“sjh”比较:大返回1;相等返回0;小返回-1

    reverse(s.begin(),s.end());//反转迭代器指向的一段区间
    cout<<s<<endl;

    vector<string> v;//string对象作为vector的元素
    v.push_back("Tom&Jerry");

    string x;
    x="123545";
    int sum=0;
    for(int i=0;i<x.length();i++)//在ACM中常常将要读入的数当成字符串来处理
    {
        if(x[i]=='0') sum+=0;
        else if(x[i]=='1') sum+=1;
        else if(x[i]=='2') sum+=2;
        else if(x[i]=='3') sum+=3;
        else if(x[i]=='4') sum+=4;
        else if(x[i]=='5') sum+=5;
        else if(x[i]=='6') sum+=6;
        else if(x[i]=='7') sum+=7;
        else if(x[i]=='8') sum+=8;
        else if(x[i]=='9') sum+=9;
    }
    cout<<sum<<endl;

    string s1,s2,s3;
    char sa[100],sb[100],sc[100];
    sscanf("abc 123 pc","%s %s %s",sa,sb,sc);//sscanf函数可以把一个字符串按你需要的方式分离出子串
    s1=sa;
    s2=sb;
    s3=sc;
    cout<<s1<<"   "<<s2<<"   "<<s3<<endl;

    return 0;
}


3.priority_queue

优先队列,基本的queue的操作基本包括在里面,stack的操作和queue差不多而且不是很常用
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;

void basic()        //元素的比较规则默认为按元素的值由大到小排序
{
    priority_queue<int> pq1;
    pq1.push(1);
    pq1.push(3);
    pq1.push(9);
    pq1.push(7);
    cout<<pq1.size()<<endl;
    while( !pq1.empty() )
    {
        cout<<pq1.top()<<" ";
        pq1.pop();
    }
    cout<<endl;
}



struct Info     //在结构体中重载 < 运算符
{
    string name;
    double score;

    bool operator < (const Info &a) const       //按score从小到大排列
    {
        return a.score<score;
    }
};

void chongzai1()    //重载 < 操作符,指定优先规则
{
    priority_queue<Info> pq2;
    Info info;

    info.name="Jack";
    info.score=68.5;
    pq2.push(info);

    info.name="Tom";
    info.score=77.5;
    pq2.push(info);

    info.name="Jerry";
    info.score=90;
    pq2.push(info);

    while( !pq2.empty() )
    {
        cout<<pq2.top().name<<" : "<<pq2.top().score<<endl;
        pq2.pop();
    }
}



struct myComp               //重载 () 运算符
{
    bool operator() (const int &a,const int &b)
    {
        return a>b;         //由小到大排列
    }
};

void chongzai2()
{
    priority_queue<int,vector<int>,myComp> pq3;
    pq3.push(1);
    pq3.push(5);
    pq3.push(3);
    pq3.push(20);
    pq3.push(8);
    cout<<pq3.size()<<endl;
    while( !pq3.empty() )
    {
        cout<<pq3.top()<<" ";
        pq3.pop();
    }
    cout<<endl;
}

int main()
{
    basic();
    cout<<endl;
    chongzai1();
    cout<<endl;
    chongzai2();
}

4.map

map是一种映射关系,一对一,第一个为关键字(first),第二个为键值(second),关键字唯一,map中的元素按关键字有序
#include<iostream>
#include<cstdio>
#include<map>

using namespace std;

void chuangjian()
{
    map<string,double> m1;
    m1["Jack"]=98.5; //插入元素按照键值从大到小放入红黑树
    m1["Bomi"]=96;
    m1["Kate"]=97.5;
    map<string,double>::iterator it1;
    for(it1=m1.begin();it1!=m1.end();it1++) cout<<(*it1).first<<" : "<<(*it1).second<<endl;
    cout<<endl;
}

void shanchu()
{
    map<int,char> m2;
    m2[25]='m';
    m2[28]='k';
    m2[10]='x';
    m2[30]='a';
    m2.erase(28); //删除键值为28的元素
    map<int,char>::iterator it2;
    for(it2=m2.begin();it2!=m2.end();it2++) cout<<(*it2).first<<" : "<<(*it2).second<<endl;
    cout<<endl;
}

void fanbianli()
{
    map<int,char> m3;
    m3[20]='o';
    m3[28]='o';
    m3[29]='o';
    m3[30]='y';
    map<int,char>::reverse_iterator it3; //反向迭代器
    for(it3=m3.rbegin();it3!=m3.rend();it3++) cout<<(*it3).first<<" : "<<(*it3).second<<endl;
    cout<<endl;
}

void yingshe()
{
    map<char,int> m4;
    for(int i=0;i<10;i++) m4[i+'0']=i; //字符映射数字(若需数字映射字符就换成m4[i]=i+'0';)
    string s="56565";
    int sum=0;
    for(int i=0;i<s.length();i++) sum+=m4[s[i]];
    cout<<"sum = "<<sum<<endl;
}

int main()
{
    chuangjian();

    shanchu();

    fanbianli();

    //元素的搜索和自定义比较函数和set基本一致,见文件“set1.cpp”
    yingshe();


    //multimap则是可以重复插入,基本与multiset差不多
    //删除和查找一样看前面
    return 0;
}

5.set

set是一种排序树,默认从小到大排序,底层是红黑树实现的
#include<bits/stdc++.h>
#include<set>  //包含set和multiset两种容器的定义

using namespace std;

set<int> s;
set<int>::iterator it; //前向迭代器
set<int>::reverse_iterator rit; //反向迭代器

void charu()
{
    s.insert(8);
    s.insert(1);
    s.insert(12);
    s.insert(6);
    s.insert(8);//重复插入,直接忽略

    for(it=s.begin();it!=s.end();it++) cout<<*it<<" "; //中序遍历集合中所有元素
    cout<<endl;
}

void fanbianli()
{
    s.insert(5);
    s.insert(55);
    s.insert(555);
    s.insert(6);
    s.insert(8);//上面函数已经插入过的都算重复插入,直接忽略
    for(rit=s.rbegin();rit!=s.rend();rit++) cout<<*rit<<" "; //反向遍历集合中所有元素
    cout<<endl;
}

void shanchu()
{
    s.erase(6); //删除的对象可以是某个迭代器位置上的元素,等于某个键值的元素,一个区间上的元素
    it=s.begin();
    s.erase(*it);
    for(rit=s.rbegin();rit!=s.rend();rit++) cout<<*rit<<" "; //反向遍历集合中所有元素
    cout<<endl;
}

void jiansuo()
{
    it=s.find(25);
    if(it!=s.end()) cout<<*it<<endl;
    else cout<<"not find it"<<endl;
}

struct mycomp //方法一:自定义比较函数,重载()操作符,集合会根据比较函数将元素放入。如果没有指定则默认从小到大
{
    bool operator () (const int &a,const int &b)
    {
        if(a!=b) return a>b;
        else return a>b; //书上这样写,但是似乎直接return a>b;也可以
    }
};

void bijiaoqi_1()
{
    set<int,mycomp> s1;
    set<int,mycomp>::iterator it1;
    s1.insert(5);
    s1.insert(55);
    s1.insert(555);
    for(it1=s1.begin();it1!=s1.end();it1++) cout<<*it1<<" "; //中序遍历集合中所有元素
    cout<<endl;
}

struct Info //方法二:元素是结构体的时候,直接将比较函数写在结构体里
{
    string name;
    double score;
    bool operator < (const Info &a) const
    {
        return a.score<score; //按从大到小排列
    }
};

void bijiaoqi_2()
{
    set<Info> s2;
    Info student;
    student.name="Jack";
    student.score=80.5;
    s2.insert(student);
    student.name="Tomi";
    student.score=60;
    s2.insert(student);
    student.name="Nacy";
    student.score=66;
    s2.insert(student);

    set<Info>::iterator it2;
    for(it2=s2.begin();it2!=s2.end();it2++) cout<<(*it2).name<<" : "<<(*it2).score<<endl; //中序遍历集合中所有元素
}

//multiset多重集合容器
multiset<string> ms;
multiset<string>::iterator mit;

void charu_multi()
{
    ms.insert("abc");
    ms.insert("123");
    ms.insert("yoooo");
    ms.insert("abc"); //允许重复插入
    for(mit=ms.begin();mit!=ms.end();mit++) cout<<*mit<<endl;
}


void shanchu_multi()
{
    cout<<"Total_deleted : "<<ms.erase("abc")<<endl; //删除指定键值的所有元素并返回删除的个数
    for(mit=ms.begin();mit!=ms.end();mit++) cout<<*mit<<endl;
}

void jiansuo_multi()
{
    mit=ms.find("yoooo"); //查找元素并返回其迭代器位置(如果存在重复元素,则返回第一个的位置),如果没找到则返回end()迭代器
    if(mit!=ms.end()) cout<<*mit<<endl;
    else cout<<"not find it"<<endl;
}

void qingchu()
{
    s.clear();
    ms.clear();
}

int main()
{
    //set
    charu();

    fanbianli();

    shanchu();

    jiansuo();

    bijiaoqi_1();
    bijiaoqi_2();

    //multiset允许重复元素键值插入
    charu_multi();

    shanchu_multi();

    jiansuo_multi();

    qingchu();
    return 0;
}

6.sort

常用的排序函数,头文件是algorithm
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<climits>
#include<iomanip>
using namespace std;

bool cmp(int const a,int const b)
{
        return a>b;
}

int main()
{
        int a[]={1,5,4,6,3};
        //sort默认从小到大排序,采用快速排序,第一个参数是要排序的区间首地址,第二个参数是区间尾地址
        sort(a,a+5);
        for(int i=0;i<5;i++) cout<<a[i]<<" ";
        cout<<endl;
        //也可以自己写一个比较函数放在第三个参数的位置,这里是从大到小
        sort(a,a+5,cmp);
        for(int i=0;i<5;i++) cout<<a[i]<<" ";
        cout<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值