c++ vector基本知识

vector介绍

标准库类型vector表示对象的集合, 其中所有对象的类型都相同.
vector也常被称为容器(container).
vector是一个类模板.
因为引用不是对象, 所以不存在包含引用的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;
}
posted @ 2021-08-19 16:52  编程驴子  阅读(143)  评论(0编辑  收藏  举报