vector
是標準庫類型,表示對象的集合,其中所有對象的類型都相同。集合中每個對象都有一個索引,用於訪問對象。
頭文件:<vector>
命名空間:std::vector
vector
是一個類模板,模板本身不是類或函數,可以看作編譯器生成類或函數的一份說明。編譯器根據模板創建類或函數過程叫做實例化。
1. vector
實例化
vector<int> vec; //保存int類型的對象
vector<vector<int>> veci; //c++11 該向量元素是int的向量對象
注意:vector能容納大多數類型的對象作爲元素,但是引用因爲不是對象,所以不能作爲元素。
1.1 元素爲vector
類型
若組成vector
的類型也是vector
,在早期版本標準中其定義的形式和現在c++11不同,過去必須在外圍vector
對象的右尖括號和元素類型之間加一個空格。
vector<vector<int>> veci; //c++11 該向量元素是int的向量對象
vector<vector<int> > veci; // 舊版本 該向量元素是int的向量對象
2. 定義和初始化vector對象
vector <T> v1; //v1是一個空vector,執行默認處初始化
vector<T> v2(v1); //v2包含v1所有元素
vector<T> v2=v1; //與上個等價
vector<T> v3(n,val); //包含n個值爲val的重複元素。
vector<T> v4(n); //包含n個執行默認初始化的對象
vector<T> v5{a,b,c...} //包含初始化值分別爲a,b,c...的元素
vector<T> v5={a,b,c...} //與上個等價
注意:最常見的定義方式是先定義一個空vector
,然後當運行時添加元素。
2.1 列表初始化vector
對象(C++11)
C++11新標準提供一種vector
對象的元素賦初值的方法,列表初始化。
vector<string> astr={"a","bc","def" };
包含了三個元素,也就是目前astr的size大小爲3。
注意:若定義時需要提供初始值,則:
使用拷貝初始化(使用=)則只能提供一個初始化值,若提供類內的初始化值,只能使用拷貝或花括號,不能使用小括號。
vector<string> astr="a";
vector<string> astr={"a","b"};
vector<string> astr=("a","b"); //錯誤
vector<string> astr("a","b");//錯誤
2.1.1列表初始化值還是初始化元素數量
- 如果用圓括號,則括號內值用來構造
vector
對象,若用花括號,則表示列表初始化值。
vector<int> v1(10);//v1又10個元素,值爲0
vector<int> v2{10};//v2有一個元素,值爲10
vector<int> v1(10,1);//v1有10個元素,值爲1
vector<int> v2{10,1};//v2有2個元素,值爲10和1
- 若花括號內值和
vector
元素類型不匹配,則嘗試用來構造vector對象。
vector<string> v1{"he"}; //列表初始化,v1有一個元素,值爲“he”
vector<string> v2("he"); //錯誤,不能使用圓括號初始化值
vector<string> v3{10}; //v3有10個元素,值都爲空
vector<string> v4{10,"he"}; //v4有10個元素,值都爲“he”
2.2 創建指定數量元素
vector<string> astr(10,"b");//創建10個string類型的元素,其值都是“b”
3. 向vector
中添加元素
vector<int> v2;
v2.push_back(2); //向v2末尾添加一個元素 ,其值爲2.
注意:如果循環體內部包含向vector
對象添加元素的語句,則不能使用範圍for
循環,因爲此時vector
的大小是變化的。
不能用下標形式添加元素,下標必須對確知存在的元素使用下標。
爲了防止越界,最好的方法就是使用範圍for
語句循環。
其他vector操作
v.empty() //判斷是否爲空,是返回true
v.at(n);//訪問位置n的元素
v.size(); //返回大小,返回值類型爲無符號整數型
v.push_back(t); //插入元素t,大小增加1
v[n]; //返回v中n位置上元素的引用
v1=v2; //拷貝v2到v1
v1={a,b,c...} // 列表初始化值
v1==v2 //當所有元素都相等則真
v1!=v2 //顧名思義
<,>,<=,>= //顧名思義
其他操作查看官網資料
4. 數組與vector
int a[]={1,2,3,4,3,2,1,2,1};
vector<int> b(a,a+9);//將數組中0到9的元素拷貝到vector
vector<int> c=(&a[0],&a[8]); //結果和上個一樣
5. 迭代器遍歷
for(vector<int>::iterator t=a.begin();t!=a.end();t++) //定義一個vector<int>類型的迭代器,進行循環迭代
......