• list map vector set 常用函数列表


    #include <stdio.h>
    #include <iostream>//cin,cout
    #include <sstream>//ss transfer.
    #include <fstream>//file
    #include "myclass.h"
    #include <list>
    #include <map>
    #include <vector>
    #include <algorithm>
    #include <memory>
    
    
    using namespace std;
    //list
    //assign() 给list赋值
    //back() 返回最后一个元素
    //begin() 返回指向第一个元素的迭代器
    //clear() 删除所有元素
    //empty() 如果list是空的则返回true
    //end() 返回末尾的迭代器
    //erase() 删除一个元素
    //front() 返回第一个元素
    //get_allocator() 返回list的配置器
    //insert() 插入一个元素到list中
    //max_size() 返回list能容纳的最大元素数量
    //merge() 合并两个list
    //pop_back() 删除最后一个元素
    //pop_front() 删除第一个元素
    //push_back() 在list的末尾添加一个元素
    //push_front() 在list的头部添加一个元素
    //rbegin() 返回指向第一个元素的逆向迭代器
    //remove() 从list删除元素
    //remove_if() 按指定条件删除元素
    //rend() 指向list末尾的逆向迭代器
    //resize() 改变list的大小
    //reverse() 把list的元素倒转
    //size() 返回list中的元素个数
    //sort() 给list排序
    //splice() 合并两个list
    //swap() 交换两个list
    //unique() 删除list中重复的元素
    
    
    
    
    //vector
    //c.assign(beg,end)c.assign(n,elem)   将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。
    //c.at(idx)       传回索引idx所指的数据,如果idx越界,抛出out_of_range。
    //c.back()      // 传回最后一个数据,不检查这个数据是否存在。
    //c.begin()     // 传回迭代器中的第一个数据地址。
    //c.capacity()  // 返回容器中数据个数。
    //c.clear()     // 移除容器中所有数据。
    //c.empty()     // 判断容器是否为空。
    //c.end()       // 指向迭代器中末端元素的下一个,指向一个不存在元素。
    //c.erase(pos)  // 删除pos位置的数据,传回下一个数据的位置。
    //c.erase(beg,end)  //删除[beg,end)区间的数据,传回下一个数据的位置。
    //c.front()     // 传回第一个数据。
    //get_allocator // 使用构造函数返回一个拷贝。
    //c.insert(pos,elem)    // 在pos位置插入一个elem拷贝,传回新数据位置。
    //c.insert(pos,n,elem)  // 在pos位置插入n个elem数据。无返回值。
    //c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值。 
    //c.max_size()       // 返回容器中最大数据的数量。
    //c.pop_back()       // 删除最后一个数据。
    //c.push_back(elem)  // 在尾部加入一个数据。
    //c.rbegin()         // 传回一个逆向队列的第一个数据。
    //c.rend()           // 传回一个逆向队列的最后一个数据的下一个位置。
    //c.resize(num)      // 重新指定队列的长度。
    //c.reserve()        // 保留适当的容量。
    //c.size()           // 返回容器中实际数据的个数。
    //c1.swap(c2)
    //swap(c1,c2)        // 将c1和c2元素互换。同上操作。
    //operator[]         // 返回容器中指定位置的一个引用。
    
    
    
    //set
    //set的各成员函数列表如下:
    //:begin()--返回指向第一个元素的迭代器
    //:clear()--清除所有元素
    //:count()--返回某个值元素的个数
    //:empty()--如果集合为空,返回true
    //:end()--返回指向最后一个元素的迭代器
    //:equal_range()--返回集合中与给定值相等的上下限的两个迭代器
    //:erase()--删除集合中的元素
    //:find()--返回一个指向被查找到元素的迭代器
    //:get_allocator()--返回集合的分配器
    //:insert()--在集合中插入元素
    //:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
    //:key_comp()--返回一个用于元素间值比较的函数
    //:max_size()--返回集合能容纳的元素的最大限值
    //:rbegin()--返回指向集合中最后一个元素的反向迭代器
    //:rend()--返回指向集合中第一个元素的反向迭代器
    //:size()--集合中元素的数目
    //:swap()--交换两个集合变量
    //:upper_bound()--返回大于某个值元素的迭代器
    //:value_comp()--返回一个用于比较元素间的值的函数
    
    
    
    
    //map
    //C++ Maps是一种关联式容器,包含“关键字/值”对
    
    //insert() 插入元素
    
    //erase() 删除一个元素
    //clear() 删除所有元素
    //find() 查找一个元素
    
    //swap() 交换两个map
    
    //begin() 返回指向map头部的迭代器
    //end() 返回指向map末尾的迭代器
    //lower_bound() 返回键值>=给定元素的第一个位置
    //upper_bound() 返回键值>给定元素的第一个位置
    //rbegin() 返回一个指向map尾部的逆向迭代器
    //rend() 返回一个指向map头部的逆向迭代器
    
    
    //empty() 如果map为空则返回true
    //max_size() 返回可以容纳的最大元素个数
    //size() 返回map中元素的个数
    //count() 返回指定元素出现的次数
    
    //value_comp() 返回比较元素value的函数
    //key_comp() 返回比较元素key的函数
    //get_allocator() 返回map的配置器
    //equal_range() 返回特殊条目的迭代器对
    
    
    
    int main()
    {
        list<int> li;
        li.push_back(3);
        li.push_back(4);
        li.push_back(5);
        li.push_back(6);
    
        list<int>::iterator itl=li.begin();
        for(itl; itl!=li.end(); ++itl)
        {
            cout<<*itl<<endl;
        }
    
        map<char,vector<string> > express;
        vector<string> astr;
        astr.push_back("hi");
        astr.push_back("whats your name?");
    
        vector<string> qstr;
        qstr.push_back("hi");
        qstr.push_back("my name is lucy!");
    
        express['Q']=qstr;//map insert.
        express['A']=astr;
    
    
    
        map<char,vector<string> >::iterator it=express.find('Q');//map find;
    
        map<char,vector<string> >::iterator it2=express.find('A');//map find;
        vector<string> fstr=it->second;
    
        for(int i=0; i!=fstr.size(); ++i)
        {
            cout<<fstr[i]<<endl;
        }
    
        cout<< express.value_comp()(*it,*it2)<<endl;//容器的算法,比较value,对于map来说还是比较key. it.key < it2.key 返回true.
    
        allocator<map<char,vector<string> > > alloc= express.get_allocator();
    
    
        alloc.destroy();
    
        cout<<express.size()<<endl;
        express.erase(it);
        cout<<express.size()<<endl;
    
    
        return 0;
    }

    map  的一个坑:

    千万不要写成 abc[i] 来 查找一个元素。
    abc[i]是表示map 的value.直接写。就等于给abc[i],用了默认的value 了。
    map<int,string> abc;
        abc.insert(map<int,string>::value_type(2,"hi"));
        abc.insert(map<int,string>::value_type(6,"ok"));
    
        cout<<abc.size()<<endl;
    //    abc[2]="hi";
    //    abc[6]="ok";
    //    abc[2]="test";
    
        for(auto &a : abc)
        {
            cout<<a.first<<":"<<a.second<<endl;
        }
    
        for(int i=0;i<abc.size();++i)
        {
            cout<<i<<":"<<abc[i]<<endl;
        }

     使用下面的进行便利。但要注意 

    for(auto &a ,是否需要修改元素,需要修改才用引用。否则用变量名,会调用赋值。一个临时变量而已。。
        map<int,int> abc;
        abc.insert(map<int,int>::value_type(2,22));
        abc.insert(map<int,int>::value_type(6,66));
    
        cout<<abc.size()<<endl;
    
    //    abc[2]="hi";
    //    abc[6]="ok";
    //    abc[2]="test";
    
        for(auto &a : abc)
        {
            a.second=77;
            cout<<a.first<<":"<<a.second<<endl;
        }
    
        for(auto a : abc)
        {
            cout<<a.first<<":"<<a.second<<endl;
        }

    关于 swap 效率分析。

    void swapabc(vector<string>& a,vector<string>& b)
    {
        b=a;
        a.clear();
    }
    
    int main()
    {
      vector<string> v1;
      for(int i=0;i<1;++i)
      {
          v1.push_back("abc");
      }
      
      vector<string> v2;
      LSU_TIME::Timer a(3);
      for(int i=0;i<1000;++i)
      {
          v1.swap(v2);
          v2.swap(v1);
      }
      cout<<a.SpanTime()<<endl;
      
      LSU_TIME::Timer b(3);
      for(int i=0;i<1000;++i)
      {
          swapabc(v1,v2);
          swapabc(v2,v1);
      }
      cout<<b.SpanTime()<<endl;

    只有一条数据swap 还是比一般的赋值,清空快1倍。基本说明只是交换指针。

    而有1000条数据。swap  的效率是一般赋值,清空的600倍。

    所以多线程下。数据的锁定,可以及时的用swap .之后放锁。

    交换指针 1000次,是0.1毫秒。那么一般的内置类型赋值就是0.00005毫秒。

    也就是1秒内可以1亿次赋值运算。还是虚拟机内。所以1秒的话可以最少3亿次赋值。

    也就是说1万个并发。除去0.5秒的网络来回。如果要1秒内回应。

    一个完整的处理最多1万次等同赋值的操作。

    所以在快速反映的程序中。基本不能有千次级别的查询。不然几个查询下来,就就支持不了万并发了。

  • 相关阅读:
    组合
    面向对象初识, 类名,对象的的使用, 类名称空间和对象名称空间
    内置函数2 递归函数
    内置函数~~~
    生成器 列表推导式 列表表达式
    函数名应用 闭包 迭代器
    函数 动态参数, 名称空间 作用域 取值顺序,函数的嵌套
    函数初识~~
    文件操作要点
    Mysql索引原理
  • 原文地址:https://www.cnblogs.com/lsfv/p/6010797.html
Copyright © 2020-2023  润新知