STL初学

#include<iostream>
#include<cstdio>
#include<vector>
#include<numeric>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<deque>
#include<list>
#include<cstdlib>
#include<bitset>
#include<stack>
#include<queue>
using namespace std;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~priority_queue

struct student
{
    int num;
    int score;
    bool operator < (const student &s)const
    {
        return s.score<score;
    }
};
struct mycom
{
    bool operator () (const int &a,const int &b)
    {
        return a>b;
    }
};
int main()
{
    priority_queue<int> pq;
    pq.push(2);
    pq.push(1);
    pq.push(6);
    pq.push(3);
    cout<<pq.size()<<endl;
    cout<<pq.empty()<<endl;
    while(pq.empty()!=true)
    {
        cout<<pq.top()<<' ';
        pq.pop();
    }
    cout<<endl;
    priority_queue<student> pqs;
    student a;
    a.num=1;
    a.score=75;
    pqs.push(a);
    a.num=2;
    a.score=66;
    pqs.push(a);
    a.num=3;
    a.score=82;
    pqs.push(a);
    a.num=4;
    a.score=80;
    pqs.push(a);
    cout<<pqs.size()<<endl;
    cout<<pqs.empty()<<endl;
    while(pqs.empty()!=true)
    {
        cout<<pqs.top().num<<' '<<pqs.top().score<<endl;
        pqs.pop();
    }
    priority_queue<int,vector<int>,mycom> pqi;
    pqi.push(10);
    pqi.push(3);
    pqi.push(1);
    pqi.push(6);
    while(pqi.empty()!=true)
    {
        cout<<pqi.top()<<' ';
        pqi.pop();
    }
    cout<<endl;
}
~~~~~~~~~~~~~~~~~~~~~~~~~queue
int main()
{
    queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);
    q.push(6);
    cout<<q.size()<<endl;
    cout<<q.empty()<<endl;
    cout<<q.front()<<endl;
    cout<<q.back()<<endl;
    while(q.empty()!=true)
    {
        cout<<q.front()<<' ';
        q.pop();
    }
    cout<<endl;
}
~~~~~~~~~~~~~~~~~~~~~~~~~stack
int main()
{
    stack<int> s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(6);
    cout<<s.top()<<endl;
    cout<<s.size()<<endl;
    cout<<s.empty()<<endl;
    while(s.empty()!=true)
    {
        cout<<s.top()<<' ';
        s.pop();
    }
    cout<<endl;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bitset
int main()
{
    bitset<10> b;
    b[0]=1;
    b[5]=1;
    b[10]=1;
    for(int i=0;i<=b.size()-1;i++)
    {
        cout<<b[i]<<' ';
    }
    cout<<endl;
    b.set(3,1);
    for(int i=0;i<=b.size()-1;i++)
    {
        cout<<b[i]<<' ';
    }
    cout<<endl;
    b.set(3,0);
    for(int i=0;i<=b.size()-1;i++)
    {
        cout<<b[i]<<' ';
    }
    cout<<endl;
    b.set(3);
    for(int i=0;i<=b.size()-1;i++)
    {
        cout<<b[i]<<' ';
    }
    cout<<endl;
    b.reset(3);
    for(int i=0;i<=b.size()-1;i++)
    {
        cout<<b[i]<<' ';
    }
    cout<<endl;
    b.set();
    for(int i=0;i<=b.size()-1;i++)
    {
        cout<<b[i]<<' ';
    }
    cout<<endl;
    b.set(3,0);
    cout<<b<<endl;//反向输出
}
~~~~~~~~~~~~~~~~~~~~~~~~~list
int main()
{
    list <int> l;
    l.push_back(2);
    l.push_back(13);
    l.push_back(4);
    l.push_front(10);
    list<int>::iterator it;
    it=l.begin();
    it++;
    l.insert(it,9);
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    list<int>::reverse_iterator rit;
    for(rit=l.rbegin();rit!=l.rend();rit++)
    {
        cout<<*rit<<' ';
    }
    cout<<endl;
    l.push_back(2);
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    l.remove(2);
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    it=l.begin();
    it++;
    l.erase(it);
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    l.push_back(6);
    l.push_back(5);
    l.push_back(3);
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    //l.clear();//清空链表
    cout<<l.size()<<endl;//size()返回链表长度
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    it=find(l.begin(),l.end(),10);
    cout<<"find(10)"<<endl;
    if(it!=l.end())
    {
        cout<<"find it"<<endl;
    }
    else

    {
        cout<<"not find it"<<endl;
    }
    it=find(l.begin(),l.end(),66);
    cout<<"find(66)"<<endl;
    if(it!=l.end())
    {
        cout<<"find it"<<endl;
    }
    else
    {
        cout<<"not find it"<<endl;
    }
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    l.sort();
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    l.push_back(6);
    l.push_back(6);
    l.push_front(3);
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    l.unique();//剔除连续元素(相邻相同保留一个)
    for(it=l.begin();it!=l.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~lian biao
#define NULL 0;
int sum=0;
struct student
{
    int num,score;
    struct student *next;
};
void print(struct student *head)
{
    struct student *p=head;
    if(head!=NULL)
    {
        while(p!=NULL)
        {
            cout<<p->num<<' '<<p->score<<endl;
            p=p->next;
        }
    }
}
int main()
{
    struct student *head,*p,*q;
    head=NULL;
    p=q=(struct student *)malloc(sizeof(struct student));
    sum=0;
    cin>>p->num>>p->score;
    while(p->num!=0)
    {
        sum++;
        if(sum==1)
        {
            head=p;
            head->next=NULL;
        }
        else
        {
            q->next=p;
            q=p;
            p=(struct student *)malloc(sizeof(struct student));
            cin>>p->num>>p->score;
        }
        p->next=NULL;
    }
    print(head);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~deque
int main()
{
    deque<int> d;
    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    d.push_back(4);
    d.push_front(10);
    d.push_front(20);
    deque<int>::iterator it;
    for(it=d.begin();it!=d.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    d.insert(d.begin()+3,50);
    d.push_back(60);
    for(it=d.begin();it!=d.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    //使用erase()从中部删除元素 参数为所需删除的元素的指针
    d.erase(d.begin()+3);
    //使用pop_front()从头部删除元素
    d.pop_front();
    d.pop_front();
    //使用pop_back()从尾部删除元素
    d.pop_back();
    //还可采用clear()清空对列
    for(it=d.begin();it!=d.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    //size()函数返回队列的长度
    cout<<d.size()<<endl;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~multimap
int main()
{
    multimap<string,double> mm;
    mm.insert(pair<string,double>("aaa",1.11));
    mm.insert(pair<string,double>("bbb",2.22));
    mm.insert(pair<string,double>("ccc",3.33));
    mm.insert(pair<string,double>("ddd",4.44));
    mm.insert(pair<string,double>("ccc",3.33));
    multimap<string,double>::iterator it;
    for(it=mm.begin();it!=mm.end();it++)
    {
        cout<<(*it).first<<' '<<(*it).second<<endl;
    }
    //删除操作采用 erase()方法,
    //可删除某个迭代器位置上的元素,等于某个键值的所有重复元素,
    //一个迭代器区间上的元素.使用clear()方法可将multimap容器中的元素清空.
    mm.erase("ccc");
    for(it=mm.begin();it!=mm.end();it++)
    {
        cout<<(*it).first<<' '<<(*it).second<<endl;
    }
    mm.insert(pair<string,double>("ccc",3.33));
    //由于multimap存在重复的键值,
    //所以find()方法只返回重复键值中的第一个元素的迭代器位置,
    //如果没有找到该键值,则返回end()迭代器位置
    it=mm.find("ccc");
    if(it!=mm.end())
    {
        cout<<(*it).first<<' '<<(*it).second<<endl;
    }
    else
    {
        cout<<"not find it"<<endl;
    }
    it=mm.find("eee");
    if(it!=mm.end())
    {
        cout<<(*it).first<<' '<<(*it).second<<endl;
    }
    else
    {
        cout<<"not find it"<<endl;
    }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~map
int main()
{
    map<int,char> m;
    m[9]='a';
    m[3]='b';
    m[7]='c';
    m[1]='d';
    map<int,char>::iterator it;
    for(it=m.begin();it!=m.end();it++)
    {
        cout<<(*it).first<<' '<<(*it).second<<endl;
    }
    //与set容器一样,map映照容器的erase()删除元素函数,
    //可以删除某个迭代器位置上的元素,等于某个键值的元素,一个迭代器区间上的所有元素,
    //当然,也可使用clear()方法清空map映照容器,
    m.erase(7);
    for(it=m.begin();it!=m.end();it++)
    {
        cout<<(*it).first<<' '<<(*it).second<<endl;
    }
    //元素反向遍历
    map<int,char>::reverse_iterator rit;
    for(rit=m.rbegin();rit!=m.rend();rit++)
    {
        cout<<(*rit).first<<' '<<(*rit).second<<endl;
    }
    //使用find()方法来搜索某个键值,如果搜索到了,则返回该键值所在的迭代器位置,
    //否则,返回end()迭代器位置.由于map采用黑白树数据结构来实现,所以搜索速度是极快的,
    it=m.find(3);
    if(it!=m.end())
    {
        cout<<(*it).first<<' '<<(*it).second<<endl;
    }
    else
    {
        cout<<"not find it"<<endl;
    }
    it=m.find(5);
    if(it!=m.end())
    {
        cout<<(*it).first<<' '<<(*it).second<<endl;
    }
    else
    {
        cout<<"not find it"<<endl;
    }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~multiset
multiset与set一样,也是使用红黑树来组织元素数据的,唯一不同的是,
multiset允许重复的元素键值插入,而set则不允许
int main()
{
    multiset<string> ms;
    ms.insert("123");
    ms.insert("abc");
    ms.insert("ABC");
    ms.insert("abc");
    multiset<string>::iterator it;
    for(it=ms.begin();it!=ms.end();it++)
    {
        cout<<*it<<endl;
    }
    //采用 erase()方法可以删除multiset对象中的某个迭代器位置上的元素,
    //某段迭代器区间中的元素,键值等于某个值的所有重复元素,并返回删除元素的个数
    int n=ms.erase("abc");
    cout<<n<<endl;
    for(it=ms.begin();it!=ms.end();it++)
    {
        cout<<*it<<endl;
    }
    ms.insert("abc");
    ms.insert("aaa");
    ms.insert("ccc");
    //使用 find()方法查找元素,如果找到,则返回该元素的迭代器位置
    //(如果该元素存在重复,则返回第一个元素重复元素的迭代器位置);
    //如果没有找到,则返回end()迭代器位置
    it=ms.find("aaa");
    if(it!=ms.end())
    {
        cout<<*it<<endl;
    }
    else
    {
        cout<<"not find it"<<endl;
    }
    it=ms.find("bbb");
    if(it!=ms.end())
    {
        cout<<*it<<endl;
    }
    else
    {
        cout<<"not find it"<<endl;
    }

}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~set
int main()
{
    set<int> s;
    s.insert(7);
    s.insert(4);
    s.insert(15);
    s.insert(7);//因为已经有7所以不再存
    s.insert(1);
    set<int>::iterator it;
    for(it =s.begin();it!=s.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    set<int>::reverse_iterator rit;
    for(rit=s.rbegin();rit!=s.rend();rit++)
    {
        cout<<*rit<<' ';
    }
    cout<<endl;
    s.insert(3);
    s.insert(6);
    s.insert(9);
    s.insert(12);
    s.insert(15);
    for(it=s.begin();it!=s.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    //删除3的倍数  详解看博客https://blog.csdn.net/yangruibao/article/details/9040045
    for(it=s.begin();it!=s.end();)
    {
        if(*it%3==0)
        {
            s.erase(it++);
        }
        else
        {
            it++;
        }

    }
    //当时用erase()删除指定区间时只能删除(s.begin()————s.end())
    for(it=s.begin();it!=s.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    if(s.find(6)!=s.end())
    {
        cout<<*(s.find(6))<<' ';
    }
    else
    {
        cout<<"not find it"<<' ';
    }
    cout<<endl;
    if(s.find(7)!=s.end())
    {
        cout<<*(s.find(7))<<' ';//可写成cout<<*s.find(7)<<' ';
    }
    else
    {
        cout<<"not find it"<<' ';
    }
    cout<<endl;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~string
int main()
{
    string s;
    char ss[]="bbbbbb";
    s=ss;
    //在 string 对象的尾部添加一个字符(char),采用“+”操作符即可
    s=s+'a';
    cout<<s<<endl;
    //从 string 对象尾部追加字符串
    //1
    s=s+"bbb";
    cout<<s<<endl;
    //2
    s.append("append");
    cout<<s<<endl;
    s.insert(s.begin(),'1');//在s.begin()位置插入字符'1' 其余元素后移一位(包括s.begin()位置上的元素)
    cout<<s<<endl;
    s.insert(s.begin()+9,'z');//在s.begin()+9位置插入字符'z' 其余元素后移一位(包括s.begin()+9位置上的元素)
    cout<<s<<endl;
    s.replace(2,3,"aa");//用"aa"代替从s.begin()+2位置开始的长度为3的串
    cout<<s<<endl;
    //采用 find()方法可查找字符串中的第一个字符元素(char,用单引号界定)或者子串(用双引号界定)
    //如果查到,则返回下标值(从0开始计数),如果查不到,则返回4294967295.
    cout<<s.find('z')<<endl;
    cout<<s.find('o')<<endl;
    cout<<s.find("append")<<endl;
    //string 对象可与使用 compare()方法与其他字符串相比较.
    //如果它比对方大,则返回1;如果它比对方小,则返回-1;
    //如果它与对方相同(相等),则返回 0
    //判断方法:从第一个开始判断 通过比较ASCII码的大小来判断大小
    //(如"1aaa">"1baabbabzbbappend","1baabbabzbbappend"<"append")
    cout<<s.compare("append")<<endl;
    cout<<s.compare("1aaa")<<endl;
    cout<<s.compare("1baabbabzbbappend")<<endl;
    vector<string> a;
    a.push_back("aaaa");
    a.push_back("bbbb");
    a.push_back("cccc");
    cout<<a[0]<<endl;
    cout<<a.size()<<endl;
    //使用accumulate将string队列连接成一个字符串
    string sss=accumulate(a.begin(),a.end(),string(""));
    cout<<sss<<endl;
    for(int i=0;i<a.size();i++)
    {
        cout<<a[i]<<endl;
        printf(a[i].c_str());//printf采用printf(s.c_str())输出
        printf("\n");
        cout<<'\n';
    }
    return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~vector
bool comp(const int &a,const int &b)
{
    return a>b;
}
int main(int argc, char* argv[])
{
    //定义向量 v
    vector<int> v;
    int i;
    vector<int>::iterator it;
    //赋值
    for(i=0;i<3;i++)
    {
        //尾部元素扩张方式赋值
        v.push_back(i);
    }
    v.insert(v.begin(),8);//在v.begin()的位置插入8  其后的元素全部后移一位
    v.insert(v.begin()+2,7);//在v.begin()+2的位置插入7  其后的元素全部后移一位
    for(it=v.begin();it!=v.end();it++)//(v.end()返回最后一个元素的下一个元素的地址)
    {
        cout<<*it<<" ";
    }
    cout<<endl;//回车换行
    v.erase(v.begin());//删除指定位置上的数(v.begin()上的数)
    v.erase(v.begin()+1);//删除(v.begin()+1上的数)
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;//回车换行
    for(i=3;i<15;i++)
    {
        v.push_back(i);
    }
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;//回车换行
    v.erase(v.begin()+7,v.begin()+10);//左闭右开(删除v.begin()————v.begin()+10-1)
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;//回车换行
    reverse(v.begin()+2,v.begin()+5);//反向排序(左闭右开)
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;//回车换行
    sort(v.begin(),v.end());//从小到大排序(左闭右开)
    //使用 iterator 迭代器顺序遍历所有元素
    for(it=v.begin();it!=v.end();it++)
    {
        //输出迭代器当前位置上的元素值
        cout<<*it<<" ";
    }
    cout<<endl;
    sort(v.begin(),v.end(),comp);
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;//回车换行
    for(it=v.begin();it!=v.end();)
    {
        if(*it%2==0)
        {
            v.erase(it);
        }
        else
        {
            it++;
        }
    }
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;
    //统计并输出向量所有元素的和(范围:v.begin()--v.end()  初值为0)
    cout<<accumulate(v.begin(),v.end(),0)<<endl;//(左闭右开)
    cout<<v.size()<<endl;
    cout<<v.empty()<<endl;
    v.clear();
    cout<<v.size()<<endl;
    cout<<v.empty()<<endl;
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/ecjtu_17_TY/article/details/80942954
STL