vector的定義
vector是C++標準庫裏最常用的容器,它之所以被稱爲容器,是因爲它可以存放多個對象,所有在用一個容器中的對象都應該具有相同的類型。
vector也是一個類模板,這也是它能存放多種類型元素的原因。關於類模板的知識,請參考我的另一篇文章:http://blog.csdn.net/larry233/article/details/50985945
初始化vector
- vectorv1; // vector that holds objects of type T.Default constructor v1 is empty
- vectorv2(v1); //v2 is a copy of v1
- vectorv3(n,i);//v3 has n elements with value i
- vectorv4(n); //v4 has n copies of a value-initialized object
示例如下:
vector<int>ivec1;
vector<int>ivec2(10); //該容器含10個元素,被默認初始化爲0
vector<int>ivec3(10,1); //該容器裏的10個元素均爲1
vector<string>ivec4(10,"hi");//該容器裏的10個元素均爲“hi”
vector的操作
- v.empty()//Returns true if v is empty,otherwise returns false
- v.size()//Returns numbers of elements in v
- v.push_back(t)//Adds element with elements in v
- v[n]//Returns element at position n in v
- v1 == v2//Returns true if v1 equals to v2
向容器中增加元素
示例如下:
string word;
vector<string>text;
while(cin>>word){
text.push_back(word);
}
int i;
vector<int>ivec;
while(cin>>i){
ivec.push_back(i);
}
用數組下標訪問vector中的元素
示例如下:
for(vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
cout<<ivec[ix]<" ";
迭代器
儘管我們可以使用數組下標來訪問vector中的元素,但是標準函數庫也提供了另一種訪問、處理元素的方式,那就是迭代器(iterator)。迭代器使得編寫與容器類型無關的泛型算法成爲可能。
vector的迭代器的聲明
vector<int>::iterator iter;
使用迭代器的示例如下:
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
*iter = 0; //set element tp which iter refers to 0
const_iterator
如果我們不想改變迭代器指向的容器裏的元素的值,我們可以使用const_iterator
示例如下:
for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
cout<<*iter<<endl; //only print each value in ivec
使用const_iterator後,任何試圖改變容器內的值的操作都是錯誤的:
for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
*iter = 0; //error,*iter is const
const_iterator很容易和const iterator(const類型的iterator)搞混掉。我們可以這麼理解:
const_iterator 類似於指向const類型變量的指針,而const類型的iterator類似於const pointer,即該iterator本身是const類型的。即:
//an iterator that can't write elements
vector<int>::const_iterator
//an iterator whose value cann't change
const vector<int>::iterator
const iterator的示例如下:
vector<int>num(10);
const vector<int>::iterator cit = num.begin();
*cit = 1; //ok,cit can change its underlying element
++cit; //error,can't change the value of cit
由於const_iterator只能讀取數據,因此它既能被用於const類型的vector,也能被用於non-const類型的vector。而const類型的iterator就顯得”useless”了,因爲一旦它被初始化,它就只能指向該元素,而不能指向其他元素。
const vector<int>nine(10,9);//cann't change elements in nines
//error:cit2 could change the element it refers to but nines is const
const vector<int>::iterator cit2 = nine.begin();
//ok:it cann't change an element value,so it can be used with a const vector<int>
vector<int>const_iterator it = nine.begin();
*it = 10;//error:*it is const
++it;//ok:it isn't const so we can change its value
iterator的算數運算
- 迭代器只能與整數相加減,不能與迭代器相加,只能相減。比較屬於兩個不同容器對象的迭代器屬於未定義的行爲。如:
iter + n
iter - n
iter1- iter2
相減運算不常見,不再贅述。- 更爲實用的應用是直接對迭代器進行算數運算以改變它所指向的元素,如:
vector<int>::iterator mid = ivec.begin() + ivec.size() / 2;
//equals to:
vector<int>::iterator mid = (ivec.begin() + ivec.end()) / 2;
//寫完這篇我就去好好複習,講真。