zoukankan      html  css  js  c++  java
  • c++ vector基本知识

    vector介绍

    标准库类型vector表示对象的集合, 其中所有对象的类型都相同.
    vector也常被称为容器(container).
    vector是一个类模板.
    因为引用不是对象, 所以不存在包含引用的vector.
    在遍历vector对象时, 循环体中不能改变该vector对象的大小.

    vector初始化

    //#include <vector>
    //using std::vector;
    
    vector<int> ivec; //保存int类型的对象
    vector<vector<string>> file; //vector元素是vector对象, 可以认为是二维vector.
    
    //初始化vector的方法
    vector<T> v1            ; //声明一个空vector, 执行默认初始化
    vector<T> v2(v1)        ; //v2包含v1所有元素的副本
    vector<T> v3 = v1       ; //等价于v3(v1)
    vector<T> v4(n, val)    ; //v4包含n个重复的元素, 每个元素值都是val
    vector<T> v5(n)         ; //v5包含n个重复的元素, 每个元素值都是初始化对象, int的初始值为0, sting的初始值为空串""
    vector<T> v6{a,b,c...}  ; //v6, 使用一组值初始化
    vector<T> v7={a,b,c...} ; //v7, 等价于v7{a,b,c...}
    
    //使用花括号的是列表初始化,
    //使用圆括号的是值初始化,
    vector<int> v1(8)       ; //v1有8个元素, 每个的值都是0;
    vector<int> v2{8}       ; //v2有1个元素, 该元素的值是8;
    
    vector<int> v3(8, 1)    ; //v3有8个元素, 每个的值都是1;
    vector<int> v4{8, 1}    ; //v4有2个元素, 值分别是8, 1;
    
    vector<string> v5{"hi"} ; //v5有1个元素, 列表初始化
    vector<string> v6("hi") ; //错误, 值初始化第一个参数不能是字符串字面值
    
    //当使用{}, 但又无法执行列表初始化时, 编译器会尝试进行值初始化
    vector<string> v7{10}   ; //v7有10个元素, 因为10与string类型不匹配, 无法执行列表初始化, 所以编译器进行了值初始化.
    vector<string> v8{10, "hi"}; //v8有10个元素, 因为10与string类型不匹配, 无法执行列表初始化, 所以编译器进行了值初始化.
    
    vector<T> v6(a,b,c...)  ; //错误
    
    

    操作vector

    #include <vector>
    using std::vector;
    vector<int> v1  ; //空vector对象
    v1.push_back(9) ; //向尾端添加一个元素9. 添加元素不能用下标, 会报告不存在这个下标.
    v1.empty()      ; //v1是否为空(不含有任何元素)
    v1.size()       ; //v1中元素的个数
    v1[n]           ; //返回第n个元素的引用, 下标必须合法, 否则报错.
    v1 = v2         ; //用v2中的元素拷贝替换v1中的元素
    v1 = {a,b,c...} ; //用列表中的元素拷贝替换v1中的元素
    v1 == v2        ; //v1和v2的元素个数相同, 且对应位置的元素值相同
    <, <=, >, >=    ; //以字典顺序进行比较
    

    //遍历vector

    vector<int> v{1,2,3,4,5,6,7,8,9} ;
    for(auto &i:v) //i是个引用, 
        i *= i;    //改变i会改变原vector
    
    for(auto i:v) //i是临时变量
        cout << i << endl;
    
    //vector的size_type要包含元素类型
    vector<int>::size_type  //正确
    vector::size_type       //错误, 没有元素类型
    

    使用多维vector

    #include <iostream>
    #include <string>
    #include <vector>
    
    int main()
    {
        using std::cout;
        using std::endl;
        using std::string;
        using std::vector;
    
        vector<vector<string>> a(2); //二维vector, 第一维有两个元素
    
        //给第二维追加元素
        a[0].push_back("00"); //a[0][0]
        a[0].push_back("01"); //a[0][1]
    
        //a[1][0], a[1][1], a[1][2], a[1][3]
        a[1].push_back("10"); //a[1][0]
        a[1].push_back("11"); //a[1][1]
        a[1].push_back("12"); //a[1][2]
        a[1].push_back("13"); //a[1][3]
    
        //给第一维再追加元素, 注意v_tmp的类型必须是vector<string>
        vector<string> v_tmp;
        a.push_back(v_tmp); 
        a[2].push_back("20"); //a[2][0]
        a[2].push_back("21"); //a[2][1]
        a[2].push_back("22"); //a[2][2]
    
        //遍历, 使用iterator
        for(auto it0=a.begin(); it0!=a.end(); it0++)
        {
            //使用distance获取两个iter的距离, 相当于当前idx, 如果第一个参数大, 则返回负值
            cout << "" << distance(a.begin(), it0) << endl;
    
            //使用it0->begin()获取第二维vector的开头
            for(auto it1=it0->begin(); it1!=it0->end(); it1++)
            {
                //使用*it1得到第二维的值
                cout << "    " << distance(it0->begin(), it1) << ": " << *it1 << endl;
            }
        }
    
        //遍历, 使用下标, 下标类型为对应vector的size_type
        for(vector<vector<string>>::size_type i=0; i<a.size(); i++)
        {
            cout << "" << i << endl;
            for(vector<string>::size_type j=0; j<a[i].size(); j++)
            {
                cout << "    " << j << ": " << a[i][j] << endl;
            }
        }
    
        return 0;
    }
    
  • 相关阅读:
    maven使用杂记
    Gradle中的SourceSet理解
    CyclicBarrier正确的使用方法和错误的使用方法
    jstack 结果查看
    java1.8中ConcurrentHashMap
    grub2配置关键(三个核心变量prefix、root、cmdpath)和几点疑问
    关于docker的理解随记
    docker中的命令参数(小白常用)
    tmux快捷键汇总(常用)
    archlinux安装gnome的一些坑随记
  • 原文地址:https://www.cnblogs.com/gaiqingfeng/p/15128143.html
Copyright © 2011-2022 走看看