• STL库函数 持续更新


     *容器 (1)顺序容器 vector[顺序表直接访问] depue[前后直接访问] list[双向链表]

    vector 检索(用operator[ ])速度快

    1.push_back   在数组的最后添加一个数据
    2.pop_back    去掉数组的最后一个数据 
    3.at                得到编号位置的数据
    4.begin           得到数组头的指针
    5.end             得到数组的最后一个单元+1的指针
    6.front        得到数组头的引用
    7.back            得到数组的最后一个单元的引用
    8.max_size     得到vector最大可以是多大
    9.capacity       当前vector分配的大小
    10.size           当前使用数据的大小
    11.resize         改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
    12.reserve      改变当前vecotr所分配空间的大小
    13.erase         删除指针指向的数据项
    14.clear          清空当前的vector
     15.rbegin        将vector反转后的开始指针返回(其实就是原来的end-1)
     16.rend          将vector反转构的结束指针返回(其实就是原来的begin-1)
     17.empty        判断vector是否为空
    18.swap         与另一个vector交换数据
    
      
    View Code

    deque 检索效率没vector高 两端插入和list一样

    析构函数:
    
    c.~ deque<Elem>()   ;销毁所有元素,并释放内存。
    
    非变动性操作
    
    c.size();         //返回当前的元素数量
    
    c.empty();       //判断大小是否为零。等同于c.size() == 0,但可能更快
    
    c.max_size();    //可容纳元素的最大数量
    
    c.at(idx) ;       //返回索引为idx所标示的元素。如果idx越界,抛出out_of_range
    
    c[idx] ;         //返回索引idx所标示的元素。不进行范围检查
    
    c.front() ;       //返回第一个元素,不检查元素是否存在
    
    c.back();        //返回最后一个元素
    
    c.begin();       //返回一个随机迭代器,指向第一个元素
    
    c.end();         //返回一个随机迭代器,指向最后元素的下一位置
    
    变动性操作:
    
    c1 = c2  ;        //将c2的所有元素赋值给c1;
    
    c.assign(n , elem);    //将n个elem副本赋值给c
    
    c.assing(beg , end);   //将区间[beg;end]中的元素赋值给c;
    
    c.push_back(elem);   //在尾部添加元素elem
    
    c.pop_back()    ;    //移除最后一个元素(但不回传)
    
    c.push_front()   ;   //在头部添加元素elem
    
    c.pop_front()    ;   //移除头部一个元素(但不回传)
    
    c.erase(pos)    ;   //移除pos位置上的元素,返回一元素位置
    
                      //如 c.erase( c.begin() + 5)  //移除第五个元素
    
    c.insert(pos , elem); //在pos位置插入一个元素elem,并返回新元素的位置
    
    c.insert(pos , n , elem); //在pos位置插入n个元素elem,无返回值
    
    c.insert(pos , beg , end);
    
    c.resize(num);       //将容器大小改为num。可更大或更小。
    
    c.resize(num , elem);  //将容器大小改为num,新增元素都为 elem
    
    c.clear();            //移除所有元素,将容器清空
    View Code

    list 插入,删除元素效率高 只支持遍历 检索排序效率低

    成员函数
    c.begin()      返回指向链表第一个元素的迭代器。
    c.end()      返回指向链表最后一个元素之后的迭代器。
    c.front()      返回链表c的第一个元素。
    c.back()      返回链表c的最后一个元素。
    c.empty()  判断链表是否为空。
    c.size()      返回链表c中实际元素的个数。
    c.max_size()      返回链表c可能容纳的最大元素数量。
    c.clear()      清除链表c中的所有元素。
    c.rbegin()      返回逆向链表的第一个元素,即c链表的最后一个数据。
    c.rend()      返回逆向链表的最后一个元素的下一个位置,即c链表的第一个数据再往前的位置。
    c.assign(n,num)      将n个num拷贝赋值给链表c。
    c.assign(beg,end)      将[beg,end)区间的元素拷贝赋值给链表c。
    c.insert(pos,num)      在pos位置插入元素num。
    c.insert(pos,n,num)      在pos位置插入n个元素num。
    c.insert(pos,beg,end)      在pos位置插入区间为[beg,end)的元素。
    c.erase(pos)    删除pos位置的元素。
    c.push_back(num)      在末尾增加一个元素。
    c.pop_back()      删除末尾的元素。
    c.push_front(num)      在开始位置增加一个元素。
    c.pop_front()      删除第一个元素。
    c1.swap(c2);      将c1和c2交换。
    swap(c1,c2);      同上。
    c.sort()       将链表排序,默认升序
    c.sort(comp)       自定义回调函数实现自定义排序
    
    
    http://www.cnblogs.com/scandy-yuan/archive/2013/01/08/2851324.html
    View Code

    (2)关联容器 set[快查无重复] multiset[快查有重复] map[一对一映射无重] multimap[一对一映射有重]

    set(默认排序)

    平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。
     构造set集合主要目的是为了快速检索,不可直接去修改键值。
    
     常用操作:
    1.元素插入:insert()
     2.中序遍历:类似vector遍历(用迭代器)
    3.反向遍历:利用反向迭代器reverse_iterator。
        例:
        set<int> s;
         ......
         set<int>::reverse_iterator rit;
         for(rit=s.rbegin();rit!=s.rend();rit++)
     4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。
                set<int> s;
                 s.erase(2);        //删除键值为2的元素
                s.clear();
     5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。
                set<int> s;
                 set<int>::iterator it;
                 it=s.find(5);    //查找键值为5的元素
                if(it!=s.end())    //找到
                    cout<<*it<<endl;
                 else            //未找到
                    cout<<"未找到";
    6.自定义比较函数
        (1)元素不是结构体:
            例:
            //自定义比较函数myComp,重载“()”操作符
            struct myComp
             {
                 bool operator()(const your_type &a,const your_type &b)
                 [
                     return a.data-b.data>0;
                 }
             }
             set<int,myComp>s;
             ......
             set<int,myComp>::iterator it;
         (2)如果元素是结构体,可以直接将比较函数写在结构体内。
            例:
            struct Info
             {
                 string name;
                 float score;
                 //重载“<”操作符,自定义排序规则
                bool operator < (const Info &a) const
                 {
                     //按score从大到小排列
                    return a.score<score;
                 }
             }
             set<Info> s;
             ......
             set<Info>::iterator it
    View Code

    begin()        ,返回set容器的第一个元素

    end()      ,返回set容器的最后一个元素

    clear()          ,删除set容器中的所有的元素

    empty()    ,判断set容器是否为空

    max_size()   ,返回set容器可能包含的元素最大个数

    size()      ,返回当前set容器中的元素个数

    rbegin     ,返回的值和end()相同

    rend()     ,返回的值和rbegin()相同

    map

      begin()          返回指向map头部的迭代器
          clear()         删除所有元素
          count()          返回指定元素出现的次数
          empty()          如果map为空则返回true
          end()            返回指向map末尾的迭代器
          equal_range()    返回特殊条目的迭代器对
          erase()          删除一个元素
          find()           查找一个元素
          get_allocator()  返回map的配置器
          insert()         插入元素
          key_comp()       返回比较元素key的函数
          lower_bound()    返回键值>=给定元素的第一个位置
          max_size()       返回可以容纳的最大元素个数
          rbegin()         返回一个指向map尾部的逆向迭代器
          rend()           返回一个指向map头部的逆向迭代器
          size()           返回map中元素的个数
          swap()            交换两个map
          upper_bound()     返回键值>给定元素的第一个位置
          value_comp()      返回比较元素value的函数
    View Code

    (3)容器适配器 stack[LIFO] queue[FIFO] priority_queue[优先级高的出]

    stack

    stack
    stack 模板类的定义在<stack>头文件中。
    stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要
    的,在不指定容器类型时,默认的容器类型为deque。
    定义stack 对象的示例代码如下:
    stack<int> s1;
    stack<string> s2;
    stack 的基本操作有:
    入栈,如例:s.push(x);
    出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
    访问栈顶,如例:s.top()
    判断栈空,如例:s.empty(),当栈空时,返回true。
    访问栈中的元素个数,如例:s.size()。
    
    empty() 堆栈为空则返回真
    
    pop() 移除栈顶元素(不会返回栈顶元素的值)
    
    push() 在栈顶增加元素
    
    size() 返回栈中元素数目
    
    top() 返回栈顶元素
    
    emplace ()
    
    swap()
    View Code

     queue

      成员函数

    • empty()判断队列空,当队列空时,返回true。
    • size()访问队列中的元素个数。
    • push()会将一个元素置入queue中。
    • front()会返回queue内的第一个元素(也就是第一个被置入的元素)。
    • back()会返回queue中最后一个元素(也就是最后被插入的元素)。
    • pop()会从queue中移除一个元素。[1] 
    (constructor)Construct queue (public member function )
    emptyTest whether container is empty (public member function )
    sizeReturn size (public member function )
    frontAccess next element (public member function )
    backAccess last element (public member function )
    pushInsert element (public member function )
    emplace Construct and insert element (public member function )
    popRemove next element (public member function )
    swap Swap contents (public member function )
    View Code

    priority_queue

    (constructor)Construct priority queue (public member function )
    emptyTest whether container is empty (public member function )
    sizeReturn size (public member function )
    topAccess top element (public member function )
    pushInsert element (public member function )
    emplace Construct and insert element (public member function )
    popRemove top element (public member function )
    swap Swap contents (public member function )
    View Code

    下面是选择顺序容器类型的一些准则  0.vector 不自动排序但允许重复 list也是 set有不重复元素的特性,但其自动排序

    1.如果我们需要随机访问一个容器则vector要比list好得多 。

    2.如果我们已知要存储元素的个数则vector 又是一个比list好的选择。  

    3.如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好  

    4.除非我们需要在容器首部插入和删除元素否则vector要比deque好。

    5.如果只在容易的首部和尾部插入数据元素,则选择deque.

    6.如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑输入时将元素读入到一个List容器,接着对此容器重新拍学,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器中

    一.string

    输出用法见代码。

    #include<iostream>
    #include<string>
    using namespace std;
    int main()
    {
        string one("DZY is stupid!");
        cout<<one<<endl;
        string two(10,'o');
        cout<<two<<endl;
        string three(one);
        cout<<three<<endl;
        one+=" Oops!";
        cout<<one<<endl;
        two="Sorry! That was ";
        three[0]='P';
        string four=two+three;
        cout<<four<<endl;
        char alls[]="All's well that ends well";
        string five(alls,20);
        cout<<five<<endl;
        string six(alls+6,alls+10);
        cout<<six<<',';
        string seven(&five[6],&five[10]);
        cout<<seven<<"..."<<endl;
        string eight(four,7,16);
        cout<<eight<<"in motion!"<<endl;
        return 0;
    }
    View Code


    输入用法:

    string stuff;
    cin>>stuff;
    getline(cin,stuff);
    getline(stuff,':');  //终止条件
    operator>>(cin,stuff);
    #include <iostream>
    #include <fstream>  //文件操作
    #include <string>
    #include <cstdlib>
    int main()
    {
         using namespace std;
         ifstream fin;  //文件
         fin.open("tobuy.txt");//打开
         if (fin.is_open() == false)//判断是否打开
         {
            cerr << "Can't open file. Bye.
    ";
            exit(EXIT_FAILURE);
         }
         string item;
         int count = 0;
         
         getline(fin, item, ':');  //文件操作需要注意输入方式,终止条件
         while (fin)  // while input is good
         {
            ++count;
            cout << count <<": " << item << endl;
            getline(fin, item,':');//文件操作需要注意输入方式,终止条件
         }
         cout << "Done
    ";
         fin.close();  //关闭文件
         // std::cin.get();
         // std::cin.get();
         return 0;
    }
    View Code

     tobuy.txt

    sardines:chocolate ice cream:pop corn:leeks:
    cottage cheese:olive oil:butter:tofu:
    View Code

     string---find用法

    find(const string&str ,size_type pos=0)const 从pos开始找否则返回string::nops
    find(const char*s ,size_type pos=0)const 从s开始找否则返回string::nops
    find(const char*s ,size_type pos=0 ,size_type n)const 从pos开始,查找s的前n个字符,否则返回string::nops
    find(char ch ,size_type pos=0)const 从pos开始找字符ch找到返回首次出现位置,否则返回string::nops
    rfind()  最后一次出现位置
    find_firse_of() 找首次出现位置
    find_last_of()  最后一次出现位置
    find_firse_not_of() 找第一个不包含在已知参数中的字符
    find_last_not_of()  找最后一个不包含在已知参数中的字符
    View Code

    举例

    #include <iostream>
    #include <algorithm>
    #include <string>
    using namespace std;
    
    int main()
    {
        string s = "helllo";
        if (s.find("e") == string::npos)  //yes
            cout << "no" << endl;
        else
            cout << "yes" << endl;
    
        if (s.find("z") == string::npos)  //no
            cout << "no" << endl;
        else
            cout << "yes" << endl;
    }
    View Code

    二.lower_bound();upper_bound()

    lower_bound(a,a+n,k)在已排好序的a中利用二分法找出ai>=k的最小指针(返回值);upper_bound(a,a+n,k).......ai<=k;两个联合起来就是找k;

  • 相关阅读:
    C++实现邮件群发的方法
    HTML5 Canvas彩色小球碰撞运动特效
    ListView灵活的用法
    Win10计算器在哪里?三种可以打开Win10计算器的方法图文介绍
    设置Textview最大长度,超出显示省略号
    jQuery页面顶部下拉广告
    C#截屏
    细数人们对安卓的误解
    javaScript系列:js中获取时间new Date()详细介绍
    C# 发送Http请求
  • 原文地址:https://www.cnblogs.com/dzzy/p/4733108.html
Copyright © 2020-2023  润新知