zoukankan      html  css  js  c++  java
  • C++STL整理

    • STL整理

    • vector

    #include<bits/stdc++.h>
    #define go(i,a,b) for(int i=a;i<b;i++)
    using namespace std;
    
    vector<int>b(10,1);//赋初值,10个元素全为1 
    int main()
    {
        cout<<"b=";
        go(i,0,b.size())
        cout<<b[i]<<" ";cout<<endl;
        vector<int>a(b.begin(),b.begin()+3);//赋初值,b的前3个元素 
        cout<<"a=";
        go(i,0,a.size())
        cout<<a[i]<<" ";cout<<endl;
        a.clear();b.clear();//清空 
        b.assign(4,2);//4个元素全为2
        a.assign(b.begin(),b.begin()+2);//赋为b的前2个元素 
        cout<<"a_front="<<a.front()<<endl;//首元素 
        cout<<"b_front="<<b.front()<<endl;
        cout<<"is_empty"<<a.empty()<<endl;//不为空
        int c[10]={1,2,3,4,5,6,7,8};
        vector<int>d(c,c+8);//给d赋数组c 
        a.clear();
        cout<<"d=";
        go(i,0,d.size())cout<<d[i]<<" ";cout<<endl;
        a.assign(d.begin(),d.begin()+8);//a为d前8个元素
        cout<<"a_back="<<a.back()<<endl;
        a.push_back(9);//尾部加入元素
        cout<<"a_back="<<a.back()<<endl;
        a.pop_back();//尾部删除元素
        cout<<"a_back="<<a.back()<<endl;
        a.erase(a.begin()+2,a.begin()+5);//删除第2-5个元素(从第0个开始) 
        cout<<"a=";go(i,0,a.size())cout<<a[i]<<" ";cout<<endl; 
        a.insert(a.begin()+2,4);//在第2个插入4元素 
        a.insert(a.begin()+3,2,0);//第3个开始插入2个0元素 
        cout<<"a=";go(i,0,a.size())cout<<a[i]<<" ";cout<<endl;
        a.erase(a.begin()+2,a.begin()+5);
        cout<<"a=";go(i,0,a.size())cout<<a[i]<<" ";cout<<endl; 
        a.insert(a.begin()+2,c+2,c+5);//第2个元素开始插入数组c的2-5元素(c+5不插入) 
        cout<<"a=";go(i,0,a.size())cout<<a[i]<<" ";cout<<endl;
        cout<<"b=";go(i,0,b.size())cout<<b[i]<<" ";cout<<endl;
        a.swap(b);//交换a,b 
        cout<<"a=";go(i,0,a.size())cout<<a[i]<<" ";cout<<endl;
        a.swap(b); 
        cout<<"compare_a_b "<<(a>b)<<endl;//和字符串一样
        reverse(a.begin(),a.begin()+8);
        cout<<"a=";go(i,0,a.size())cout<<a[i]<<" ";cout<<endl;
        cout<<"find_7="<<*find(a.begin()+1,a.begin()+8,7)<<endl;
        //在第1-8(不包括8)个元素中找7,返回指针
        b.resize(9);//把b的容量变为20,多了为随机少了删掉 
        cout<<"V="<<b.capacity()<<endl;//b的容量 
        copy(a.begin(),a.end(),b.begin()+2);//从b的第二个开始被a覆盖 
        cout<<"b=";go(i,0,b.size())cout<<b[i]<<" ";cout<<endl;
    }
    • set

      set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值(也就是集合的特性)。

    set的各成员函数列表如下:

    1. begin()--返回指向第一个元素的迭代器

    2. clear()--清除所有元素

    3. count()--返回某个值元素的个数

    4. empty()--如果集合为空,返回true

    5. end()--返回指向最后一个元素的迭代器

    6. equal_range()--返回集合中与给定值相等的上下限的两个迭代器

    7. erase()--删除集合中的元素

    8. find()--返回一个指向被查找到元素的迭代器

    9. get_allocator()--返回集合的分配器

    10. insert()--在集合中插入元素

    11. lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

    12. key_comp()--返回一个用于元素间值比较的函数

    13. max_size()--返回集合能容纳的元素的最大限值

    14. rbegin()--返回指向集合中最后一个元素的反向迭代器

    15. rend()--返回指向集合中第一个元素的反向迭代器

    16. size()--集合中元素的数目

    17. swap()--交换两个集合变量

    18. upper_bound()--返回大于某个值元素的迭代器

    19. value_comp()--返回一个用于比较元素间的值的函数

    #include<iostream>
    #include<set>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    set<int>s;
    struct node
    {
        int x;
        friend bool operator < (const node &a,const node &b)
        {
            return -a.x<-b.x;
        }
    };
    set<node>ms;
    int main()
    {
        s.insert(1);
        s.insert(1);
        s.insert(2);
        s.insert(3);
        cout<<"begin:"<<*s.begin()<<endl;
        cout<<"count(1):"<<s.count(1)<<endl;
        cout<<"end:"<<*s.end()<<endl;
        cout<<"is empty:"<<s.empty()<<endl;
        s.clear();
        cout<<"is empty:"<<s.empty()<<endl;
        s.insert(1);
        s.insert(1);
        s.insert(2);
        s.insert(3);
        cout<<"count(1):"<<s.count(1)<<endl;
        s.erase(1);
        cout<<"count(1):"<<s.count(1)<<endl;
        cout<<"size:"<<s.size()<<endl;
        cout<<"*iterator find(3):"<<*s.find(3)<<endl;
        s.insert(1);
        cout<<"count(2):"<<s.count(2)<<endl;
        s.erase(2);
        cout<<"count(2):"<<s.count(2)<<endl;
        s.clear();
        int a[5]={1,4,3,8};
        s.insert(a,a+4);
        set<int>::iterator iter;
        cout<<"contain:";
        for(iter=s.begin();iter!=s.end();iter++)
        cout<<*iter<<" ";cout<<endl;
        cout<<"key>3:"<<*s.upper_bound(3)<<endl;
        cout<<"key<3:"<<*s.lower_bound(3)<<endl;
        ms.insert((node){1});
        ms.insert((node){2});
        ms.insert((node){3});
        ms.insert((node){1});
        set<node>::iterator it;
        cout<<"ms contain:";
        for(it=ms.begin();it!=ms.end();it++)
        cout<<it->x<<" ";cout<<endl;
        
    }
        
    •   $TIPS:$可以直接通过$set.insert(a,a+4)$插入多个元素,$find,upperbound,lowerbound$返回的是迭代器,$erase$有三种用法:$set.erase(iter),set.erase(begin,end),set.erase(keyval)$,分别为删除指针指向的值,两个指针间的值,键值。

    • bitset

      $bitset$是一个$01$串,每一位占一个$bit$,可以进行单点$0/1$修改,左移右移以及按位运算操作。一个非常好用的用法是统计某个数是否出现过,类似一个桶。同时两个$bitset$取或可以在优秀的复杂度下获得两个集合是否有重复元素的信息。它既是一个用于位运算的数组也是整形的一个压缩。

      1.$bitset$里的小标从左往右递减,即最右边下标为0。

      如下表:

      

    0 0 0 0 0 1 0 1

    1

    下标 8 7 6 5 4 3 2 1 0

    #include<bits/stdc++.h> using namespace std; bitset<10>s(string("00010101"));//字符串从右往左赋值 int main() { cout<<s<<endl;//输出为0000010101 unsigned int k=s.to_ulong();//自动转化为数字 cout<<k<<endl; string str=s.to_string(); cout<<str<<endl;//自动转化为01字符串 s.set();//全部赋为1 cout<<s<<endl; s.reset();//清零 cout<<s<<endl; s.set(3);//把下标为3的位置赋为1 s.set(4,1);//同上 s.set(4,0);//赋为0 cout<<s<<endl; cout<<s.test(3)<<endl;//检测3的值 cout<<s.test(4)<<endl;//检测4的值 s.reset(); s[1]=1;//赋值方法1 cout<<s<<endl; s=21;//赋值方法2 cout<<s<<endl; cout<<s.any()<<endl;//是否有1 cout<<s.none()<<endl;//是否没有1 s.reset(); cout<<s.any()<<endl; cout<<s.count()<<endl;//有几个1 s=234; cout<<s.count()<<endl; s.flip();//全部取反 cout<<s<<endl; s.flip(0); cout<<s<<endl;//下标为0取反 }
  • 相关阅读:
    汇编语言LAHF和SAHF指令
    JSONHelper
    【CSS】利用宽高比例的媒体查询
    swiftmailer时没有设置https的选项,才可以发送成功。在linux下面
    DevExpress
    IntelliJ IDEA2017 激活方法 最新的激活注册方式方法,破解,密钥
    vue.js 列表追加项写法
    RedisCache 缓存
    时间通用类 datetime
    LogHelper 日志
  • 原文地址:https://www.cnblogs.com/THRANDUil/p/11240682.html
Copyright © 2011-2022 走看看