zoukankan      html  css  js  c++  java
  • [C++] STL vector map set

    Vector


    可以理解为动态数组,可存储重复元素。

    初始化:

    vector<int> a;
    vector<int> a(5);        //5 elements is 0
    vector<int> a(5,8);        //5 elements is 8
    
    //数组初始化vector
    int a[] = {1,2,3};
    vector<int> haha(a,a + sizeof(a)/sizeof(int));
    
    //二维vector
    vector<vector<int>> matrix(n,m);    // n rows; m cols
    vector<vector<int>> matrix(n,vector<int>(m,9));    // n rows; m cols; all elements is 9

    访问:

    a[i]        //不检查越界
    a.at(i)        //访问越界抛异常

    迭代:

    for(vector<int>::iterator iter = a.begin();iter != a.end();iter++)    //迭代器
    for(int i = 0;i < a.size();i++)        //指针

    其他函数:

    .size(); .push_back(); .pop_back(); .clear(); .resize();
    
    .capacity(); .reserve(); .erase(); .empty(); .count();
    //a.size() <= a.capacity()

    find  在vector中并没有自带的.find方法,可以使用普通的find函数完成功能。

    vector<int> a;
    int b = ****;
    vector<int>::iterator iter = find(a.begin(),a.end(),b);
    if(find(a.begin(),a.end(),b) == a.end())
    {
        cout<<"Not find!"<<endl;
    }

    其中 .erase()这个函数在使用时要特别注意。 .size()减少了一,.capacity()不变。

    使用迭代器iterator访问时,  .erase()之后,这个iterator就指向下一个了,此时执行iterator++就会跳过一个元素未访问。

    for(vector<int>::iterator iter = nums.begin();iter != nums.end();)
    {
        if(! *iter)        //去掉vector中的0元素
        {
            nums.erase(iter);
        }else
        {
            iter++;
        }
    }

    .size()的返回值是无符号整型,在循环中,如果遇到空vector时进行 -1 操作会出问题。

    vector<int> haha;
    for(int i = 0;i < haha.size() - 1;i++)
    {
        cout<<"haha"<<i<<endl;
    }
    int vSize = haha.size();
    for(int i = 0;i < vSize;i++)
    {
        cout<<"hehe"<<i<<endl;
    }

    output: haha1

    不会输出hehe1,因为.size()的返回值是无符号整型,因此使用时要注意!

    插一个不错的表格,转自http://blog.csdn.net/phoebin/article/details/3864590

    Map

    关联容器(key-value),key不能重复,对key自动排序。

    map<int,string> a;

    插入元素:(第一种和第二种的效果相同,对已有的key值,不进行插入操作。第三种指针型的,能够对已有的key值进行覆盖。)

    a.insert(pair<int,string>(2,"haha"));
    a.insert(map<int,string>::value_type(2,"haha"));
    a[2] = "haha";

    删除:

    a.erase(iter);    //迭代器
    a.erase(key);    //键值
    a.erase(a.begin(),a.end());  //成片删除,前闭后开

    搜索和访问:

    iter = a.find(key);
    iter->first        //key
    iter->second    //value

    Set

    集合,有序,不包含重复元素,元素值唯一(与vector的主要区别)。集合内元素都是排列好的,所有的存取插入操作都在log(n)内完成。

    set不能直接改变元素值,这样会改变原有的正确顺序,必须先删除旧元素,再插入新元素。

    set<int> a;
    set<int,myFunc> a;    //使用自定义的比较函数进行排序
    struct myFunc
    {
        bool operator()(const char* s1,const char* s2)
        {
            return strcmp(s1,s2) < 0;
        }
    }
    
    const char* carray[] = {"abc","def","xyz"};
    set<const char* ,myFunc> a(carray,carray+3,myFunc());

    set不可直接访问下标!!!只能用迭代器。

    set<string> a;
    set<string>::iterator iter;
    for(iter = a.begin();iter != a.end();iter++)

    用vector初始化set.

    vector<string> list1;
    set<string> _list1;
    _list1.insert(list1.begin(),list1.end());

    判断插入元素是否成功用.second

    if(a.insert(7).second)

    判断元素是否属于集合

    if(a.find(4) != a.end())

    集合的并,交和差(注意在此前要将c清为空集)

    #include<algorithm>
    #include<iterator>

    set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));
    set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));
    set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));

    Reference

    http://www.cppblog.com/huyutian/articles/107457.html
    http://blog.csdn.net/wu_lai_314/article/details/8439556
    http://blog.csdn.net/wu_lai_314/article/details/8440550
    http://blog.csdn.net/wu_lai_314/article/details/8440655
    http://www.cnblogs.com/vegg117/p/3949717.html
    http://blog.csdn.net/a576699534/article/details/46502849
  • 相关阅读:
    迭代器(Iterator)的使用
    xml转array
    linux 常用命令
    yii2 httpClient的用法
    将普通用户添加到sudo
    yii2 注册一个新事件(trigger Event)
    解决IDEA输入法输入中文候选框不显示问题(亲测谷歌拼音完美解决问题)
    5个用/不用GraphQL的理由
    Linux 用户必须知道的 14 个常用 Linux 终端快捷键
    java执行系统命令, 返回执行结果
  • 原文地址:https://www.cnblogs.com/zhanxiage1994/p/6904500.html
Copyright © 2011-2022 走看看