2008年9月6日 星期六

C++標準函式庫—STL(Standard Template Library)

何謂抽象指標(Iterator)

透過指標我們可以間接地讀取或寫入指標所指變數的內含值,指標的另一個用處是用來接受new運算子動態分配得到記憶體時所傳回的Address(然後我們再利用此指標間接操作此一動態記憶體-亦即此一記憶體沒有變數名稱「不具名物件」,所以一定要透過指標來間接操作它)。一般而言,對容器類別而言,為了達到像內建指標一樣方便的設施,我們並不是定義一個像vector<int> *pvec;這樣的指標來間接操作pvec所指到的向量,而是,我們另外定義了一個更形上更抽像的指標-叫做Iterator,此Iterator就是容器類別的指標,有了Iterator,我們可以對容器內的每一個元素做間接的讀取或寫入,更進一步來說,有了Iterator,會讓泛型演算法更加地一般化(這也是為什麼sort或copy演算法可以放諸四海皆準地用在各種容器上的原因)。每一個容器類別都有二個公開的成員函式,分別是begin()和end(),它們分別會傳回容器的第一個元素的指標(Iterator)和最後一個元素的下一個位置的指標(Iterator),如:

vector<int> ivec(10); //定義一個整數向量,內含10個元素

vector<int>::iterator iter = ivec.begin() //定義一個ivec向量的指標,它指向ivec的第一個元素

vector<int>::iterator iter_end = ivec.end() //定義一個ivec向量的指標,它指向ivec的最後元素的下一個元素

然後我們就可以利用提領(Dereference)運算子 * ,來間接地讀取或寫入第一個元素的值,如:

int ia = *iter; // 將第一個元素的內含值存入ia物件中

還有可以用遞增運算子 ++ ,將指標移到下一個或之後的其他元素當中,如:

iter++; // iter變成指向第二個元素

綜上所述,所有對內建指標可以做的提領或遞增和遞減的動作,一樣通通適用於Iterators,是不是很方便呢?

C++教學講義 Part7

沒有留言: