vector物件的定義和初始化以及vector迭代器iterator
push_back()操作接受一個元素值,並將它作為一個新的元素新增到vector物件的後面,也就是“插入(push)”到vector物件的“後面(back)”:
vector迭代器
除了使用下標來訪問vector物件的元素外,標準庫還提供了另一種檢測元素的方法:使用迭代器(iterator)。迭代器是一種允許程式設計師檢查容器內元素,並實現元素遍歷的資料型別。
標準庫為每一種標準容器(包括vector)定義了一種迭代器型別。迭代器型別提供了比下標操作更一般化的方法:所有的標準庫容器都定義了相應的迭代器型別,而只有少數的容器支援下標操作。因為迭代器對所有的容器都適用,現代
容器的iterator型別
每種容器型別都定義了自己的迭代器型別,如vector:
vector<int>::iterator iter;
這條語句定義了一個名為iter的變數,它的資料型別是由vector<int>定義的iterator型別。每個標準庫容器型別都定義了一個名為iterator的成員,這裡的iterator與迭代器實際型別的含義相同。
不同的容器類定義了自己的iterator型別,用於訪問容器內的元素。換句話說,每個容器定義了一種名為iterator的型別,而這種型別支援(概念上的)迭代器的各種行為。
begin和end操作
每種容器都定義了一對命名為begin和end的函式,用於返回迭代器。如果容器中有元素的話,由begin返回的迭代器指向第一個元素:
vector<int>::iterator iter = ivec.begin();
上述語句把iter初始化為由名為begin的vector操作返回的值。假設vector不空,初始化後,iter即指該元素為ivec[0]。
由end操作返回的迭代器指向vector的“末端元素的下一個”。通常稱為超出末端迭代器(off-the-enditerator),表明它指向了一個不存在的元素。如果vector為空,begin返回的迭代器與
由end操作返回的迭代器並不指向vector中任何實際的元素,相反,它只是起一個哨兵(sentinel)的作用,表示我們已處理完vector中所有元素。
vector迭代器的自增和解引用運算
迭代器型別定義了一些操作來獲取迭代器所指向的元素,並允許程式設計師將迭代器從一個元素移動到另一個元素。
迭代器型別可使用解引用操作符(*操作符)來訪問迭代器所指向r元素:
*iter = 0;
解引用操作符返回迭代器當前所指向的元素。假設iter指向vector物件ivec的第一個元素,那麼*iter和ivec[0]就是指向同一個元素。上面這個語句的效果就是把這個元素的值賦為0。
迭代器使用自增操作符向前移動迭代器指向容器中下一個元素。從邏輯上說,迭代器的自增操作和int型物件的自增操作類似。對int物件來說,操作結果就是把int型值“加1”,而對迭代器物件則是把容器中的迭代器“向前移動一個位置”。因此,如果iter指向第一個元素,則++iter指向第二個元素。
由於end操作返回的迭代器不指向任何元素,因此不能對它進行解引用或自增操作。
迭代器的應用
for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
ivec[ix] = 0;
更典型的做法是用迭代器來編寫迴圈:
// equivalent loop using iterators to reset all the elements in ivec to 0
for (vector<int>::iterator iter = ivec.begin();
iter != ivec.end(); ++iter)
*iter = 0; // set element to which iter refers to 0
const_iterator每種容器型別還定義了一種名為 const_iterator 的型別,該型別只能用於讀取容器內元素,但不能改變其值。
如果我們對 const_iterator 型別解引用時,則可以得到一個指向 const 物件的引用,如同任何常量一樣,該物件不能進行重寫。
例如,如果 text 是 vector<string> 型別,程式設計師想要遍歷它,輸出每個元素,可以這樣編寫程式:
// use const_iterator because we won't change the elements
for (vector<string>::const_iterator iter = text.begin();
iter != text.end(); ++iter)
cout << *iter << endl; // print each element in text
const_iterator 物件與 const 的 iterator 物件的區別?
宣告一個 const 迭代器時,必須初始化迭代器。一旦被初始化後,就不能改變它的值:
vector<int> nums(10); // nums is nonconst
const vector<int>::iterator cit = nums.begin(); *cit = 1; // ok: cit can change its underlying element
++cit; // error: can't change the value of cit
對 const_iterator 型別解引用時,返回的是一個 const 值。不允許用 const_iterator: 進行賦值對 const_iterator 型別解引用時,返回的是一個 const 值。不允許用 const_iterator: 進行賦值
for (vector<string>::const_iterator iter = text.begin();iter != text.end(); ++ iter)
*iter = " "; // error: *iter is const