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); |
v2是v1的一個副本。 |
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 |
如果v1與v2相等,則返回true。 |
!=, <, <=, >, >= |
保持這些操作符慣有的含義。 |
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操作
每種容器都定義了一對命名為begin和end的函式,用於返回迭代器。如果容器中有元素的話,由begin返回的迭代器指向第一個元素:
vector<int>::iterator iter = ivec.begin();
上述語句把iter初始化為由名為begin的vector操作返回的值。假設vector不空,初始化後,iter即指該元素為ivec[0]。
由end操作返回的迭代器指向vector的“末端元素的下一個”。通常稱為超出末端迭代器(off-the-end iterator),表明它指向了一個不存在的元素。如果vector為空,begin返回的迭代器與end返回的迭代器相同。
由end操作返回的迭代器並不指向vector中任何實際的元素,相反,它只是起一個哨兵(sentinel)的作用,表示我們已處理完vector中所有元素。
vector迭代器的自增和解引用運算
迭代器型別定義了一些操作來獲取迭代器所指向的元素,並允許程式設計師將迭代器從一個元素移動到另一個元素。
迭代器型別可使用解引用操作符(*操作符)來訪問迭代器所指向r 元素:
*iter = 0;
解引用操作符返回迭代器當前所指向的元素。假設iter指向vector物件ivec的第一個元素,那麼*iter和ivec[0]就是指向同一個元素。上面這個語句的效果就是把這個元素的值賦為0。
迭代器使用自增操作符向前移動迭代器指向容器中下一個元素。從邏輯上說,迭代器的自增操作和int型物件的自增操作類似。對int物件來說,操作結果就是把int型值“加1”,而對迭代器物件則是把容器中的迭代器“向前移動一個位置”。因此,如果iter指向第一個元素,則++iter指向第二個元素。
由於end操作返回的迭代器不指向任何元素,因此不能對它進行解引用或自增操作。