vector 是一種類型對象的容器,每個對象都有一個對應的整數索引值。我們還把它稱之為 容器,是因為它可以包含其他對象。一個容器中必須包含的是同一種類型的對象,地9章會詳細介紹容器。首先是聲明:
#include <vector>
using std::vector;
vector 是一個類模板(class template),所以 vector 可以包含不同類型的對象,如 int 型,string 型。vector 的聲明
vector<int> intv;
vector<Sales_item> salesv;
vector 不是一種數據類型,只是一個模板,可用來定義任意多種數據類型。但 vector<int> 或 vector<string> 可以看成是一種類型。
1、vector 對象的定義和初始化
初始化方式 | - |
---|---|
vector<T> v1; | 默認構造,v1 為空 |
vector<T> v2(v1); | v2 是 v1 的副本 |
vector<T> v3(n, i); | v3 包含 n 個 i 的元素 |
vector<T> v4(n); | v4 初始化為含有 n 個 T 類型默認值的對象 |
例如:
vector<int> intv1;
vector<int> intv2(intv1); //ok
vector<string> strv(intv1); //error:strv 保存的是 string 類型,不是 int 類型
也可以用元素個數和元素之進行初始化
vector<int> intv(10, -1); //10 個int元素,每個初始化為 -1
vector<int> strv(10, "hi"); //10 個string元素,每個初始化為 hi
vector重要的屬性在于可以在運行時高效的添加元素,在元素已知的情況下,最好是動態的添加元素。
下面說明這種初始化情況
vector<int> intv(10);
vector<string> strv(10);
此時
-
intv
會被初始化成包含 10 個 0 的 vector 對象; -
strv
會被初始化成包含 10 個 空字符串 的 vector 對象;
這種初始化方式叫做 值初始化。
2、vector對象的操作
vector操作 | - |
---|---|
v.empty() | v 為空,返回true |
v.size() | 返回 v 中的個數 |
v.push_back(t) | 在 v 的末尾添加一個 t 元素 |
v[n] | 返回 v 中位置為 n 的元素 |
v1 = v2 | v1 的值替換成 v2 |
v1 == v2 | 若 v1 和 v2 相等,返回true |
!=, <, <=, >, >= | 保持慣有操作 |
2.1、empty和size
empty和size的操作類似于string,成員函數返回的vector類型定義的size_type的值。
使用size_type時,必須指出該類型是在哪里定義的,如
vector<int>::size_type //ok
vector::size_type //error
2.2、向vector添加元素
push_back()接受一個元素值,并將它作為一個新的元素添加到vector對象的末尾
string word;
vector<string> text;
while (cin >> word){
text.push_back(word);
}
上面程序的意思是從標準輸入讀取一系列string對象,并逐一添加到vector對象的末尾。
2.3、vector的下標操作
vector對象的元素是沒有命名的,但可以按vector對象中的位置來訪問它們,跟string類似,位置從0開始計數,下例是將vector中的每個元素置為0:
vector<int> intv(10); //含有10各元素的vector
for(vector<int>::size_type i = 0; i != intv.size(); ++i){
intv[i] = 0;
}
習慣于Java和C的程序員可能會覺得難以理解
1、for循環用 `!=` 來作為判斷條件;
2、不用變量保存 `intv.size()`;
到學習過泛型編程后就會明白
1
的合理性,至于2
,上述循環不需要增加元素,但循環很容易增加元素,所以如果增加了元素的話,那保存就不合理了。
2.4、下標操作不能添加元素
下標操作不能添加元素,但能對已有的元素進行操作,如上例中的將所有元素重置為0。所以下面的例子是錯誤的
vector<int> intv; //這是空vector,沒有元素
for (vector<int>::size_type i = 0; i != 0; ++i){
intv[i] = i; //error:intv是空
}
但下面的例子是正確的
vector<int> intv; //這是空vector,沒有元素
for (vector<int>::size_type i = 0; i != 0; ++i){
intv.push_back(i); //ok:動態增加
}
END.