c++ vector基本知識
阿新 • • 發佈:2021-08-19
目錄
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; }