1. 程式人生 > 其它 >c++ vector基本知識

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;
}