1. 程式人生 > >vector物件的定義和初始化以及vector迭代器iterator

vector物件的定義和初始化以及vector迭代器iterator

向vector新增元素

push_back()操作接受一個元素值,並將它作為一個新的元素新增到vector物件的後面,也就是“插入push)”vector物件的後面(back)

vector迭代器

除了使用下標來訪問vector物件的元素外,標準庫還提供了另一種檢測元素的方法:使用迭代器iterator)。迭代器是一種允許程式設計師檢查容器內元素,並實現元素遍歷的資料型別。

標準庫為每一種標準容器(包括vector)定義了一種迭代器型別。迭代器型別提供了比下標操作更一般化的方法:所有的標準庫容器都定義了相應的迭代器型別,而只有少數的容器支援下標操作。因為迭代器對所有的容器都適用,現代

C++程式更傾向於使用迭代器而不是下標操作訪問容器元素,即使對支援下標操作的vector型別也這樣。

容器的iterator
型別

每種容器型別都定義了自己的迭代器型別,如vector

vector<int>::iterator iter;

這條語句定義了一個名為iter的變數,它的資料型別是由vector<int>定義的iterator型別。每個標準庫容器型別都定義了一個名為iterator的成員,這裡的iterator與迭代器實際型別的含義相同。

不同的容器類定義了自己的iterator型別,用於訪問容器內的元素。換句話說,每個容器定義了一種名為iterator的型別,而這種型別支援(概念上的)迭代器的各種行為。

begin和end操作

每種容器都定義了一對命名為beginend的函式,用於返回迭代器。如果容器中有元素的話,由begin返回的迭代器指向第一個元素:

vector<int>::iterator iter = ivec.begin();

上述語句把iter初始化為由名為beginvector操作返回的值。假設vector不空,初始化後,iter指該元素為ivec[0]

end操作返回的迭代器指向vector的“末端元素的下一個”。通常稱為超出末端迭代器(off-the-enditerator),表明它指向了一個不存在的元素。如果vector為空,begin返回的迭代器與

end返回的迭代器相同。

end操作返回的迭代器並不指向vector中任何實際的元素相反它只是起一個哨兵sentinel的作用表示我們已處理完vector中所有元素。

vector迭代器的自增和解引用運算

迭代器型別定義了一些操作來獲取迭代器所指向的元素,並允許程式設計師將迭代器從一個元素移動到另一個元素。

迭代器型別可使用解引用操作符*操作符)來訪問迭代器所指向r元素:

*iter = 0;

解引用操作符返回迭代器當前所指向的元素。假設iter指向vector物件ivec的第一個元素,那麼*iterivec[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 物件的引用,如同任何常量一樣,該物件不能進行重寫。

例如,如果 textvector<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 物件與 constiterator 物件的區別?

宣告一個 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