vector和iterator及collection

@ 小浩發表於2013-12-12

Collection是所有集合的最上層介面,它裡面定義了所有集合物件都可以進行的操作;它有兩個子介面,分別是List和Set。List會記錄放在其中元素的放入順序,形象地說,可以認為是一個傳送帶,它上面所有的東西都有一個放置順序。而Set要求放置在其中的元素必須不能重複,它與數學上集合的概念完全一致。

Iterator又稱迭帶器,能對Collection進行順序遍歷。

Vector是List介面的一個具體實現,支援列表元素的順序訪問,大小可以隨著元素的增加二而增加,同時是執行緒安全的。也正為要求執行緒安全,所以訪問的效能比較差。自Java1.2以後,已經不推薦使用。Java1.2推薦使用ArrayList和LinkedList。他們都不是執行緒安全的,所以效能較好。其中ArrayList隨機訪問速度快,而LinkedList在表中間 插入的速度快。

 

vector物件的定義和初始化

vector類定義了好幾種構造函式,用來定義和初始化vector物件。

vector<T> v1;

vector儲存型別為T的物件。預設建構函式v1為空。

vector<T> v2(v1);

v2v1的一個副本。

vector<T> v3(n, i);

v3包含n個值為i的元素。

vector<T> v4(n);

v4含有值初始化的元素的n個副本。

vector的操作

vector標準庫提供許多類似於string物件的操作,下表列出了幾種最重要的vector操作。

v.empty()

如果v為空,則返回true,否則返回false

v.size()

返回v中元素的個數。

v.push_back(t)

v的末尾增加一個值為t的元素。

v[n]

返回v中位置為n的元素。

v1 = v2

v1的元素替換為v2中元素的副本。

v1 == v2

如果v1v2相等,則返回true

!=, <, <=, >, >=

保持這些操作符慣有的含義。

向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-end iterator),表明它指向了一個不存在的元素。如果vector為空,begin返回的迭代器與end返回的迭代器相同。

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

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

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

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

*iter = 0;

解引用操作符返回迭代器當前所指向的元素。假設iter指向vector物件ivec的第一個元素,那麼*iterivec[0]就是指向同一個元素。上面這個語句的效果就是把這個元素的值賦為0

迭代器使用自增操作符向前移動迭代器指向容器中下一個元素。從邏輯上說,迭代器的自增操作和int型物件的自增操作類似。對int物件來說,操作結果就是把int型值“加1”,而對迭代器物件則是把容器中的迭代器“向前移動一個位置”。因此,如果iter指向第一個元素,則++iter指向第二個元素。

由於end操作返回的迭代器不指向任何元素,因此不能對它進行解引用或自增操作。

相關文章