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
  • 相关阅读:
    LightOJ 1132 Summing up Powers(矩阵快速幂)
    hdu 3804 Query on a tree (树链剖分+线段树)
    LightOJ 1052 String Growth && uva 12045 Fun with Strings (矩阵快速幂)
    uva 12304 2D Geometry 110 in 1! (Geometry)
    LA 3263 That Nice Euler Circuit (2D Geometry)
    2013 SCAUCPC Summary
    poj 3321 Apple Tree (Binary Index Tree)
    uva 11796 Dog Distance (几何+模拟)
    uva 11178 Morley's Theorem (2D Geometry)
    动手动脑
  • 原文地址:https://www.cnblogs.com/zhanxiage1994/p/6904500.html
Copyright © 2011-2022 走看看