1. 程式人生 > 其它 >Effective STL 筆記-第4章 迭代器

Effective STL 筆記-第4章 迭代器

4 迭代器

第 26 條:iterator 優先於 const_interator、reverse_interator 及 const_reverse_interator。

不同型別的迭代器之間的關係:

儘量使用 iterator 而不是 const 或 reverse 型的迭代器,可以使得容器的使用更為簡單而有效,並且可以避免潛在的問題。

  • 有些版本的 insert 和 erase 函式要求使用 iterator。如果你需要呼叫這些函式,必須使用 iterator,const 和 reverse 型的迭代器不能滿足這些函式的要求。
  • 要想隱式地將一個 const_interator 轉換成 iterator 是不可能的。
  • 從 reverse_interator 轉換而來的 iterator 在使用之前可能需要相應的調整。
  • 儘量不要混合使用 iterator 和 const_interator,有可能通過不了編譯。

第 27 條:使用 distance 和 advance 將容器的 const_interator 轉換成 iterator。

包含顯式型別轉換的程式碼不能通過編譯的原因:對於這些容器型別(deque,list,set,multiset,map,multimap),iterator 和 const_interator 是完全不同的類。

typedef intDeque::const_interator ConstIter;
ConstIter ci;
...
Iter i(ci);											// 編譯錯誤!從const_interator到
													// iterator沒有隱式轉換途徑。
Iter i(const_caset<Iter>(ci));						// 仍然是編譯錯誤!不能將
													// const_iterator強制轉換為iterator

不過,對於 vector 和 string 而言,以上程式碼也許能通過編譯。

vector:const T* 變為 const *

string:char * 變為 const char *

將 const_interator 轉換為 iterator 可能需要線性時間的代價(雙向迭代器),安全、可移植不需要線性時間(隨機訪問迭代器)的代價。

將 advance 那一行改為

advance(i, distance<ConstIter>(i, ci));		// 將i和ci都當做const_interator,
											// 計算出它們之間的距離,然後將i移動這段距離

第 28 條:正確理解由 reverse_interator 的 base() 成員函式所產生的 iterator 的用法。

刪除 ri 所指的元素:v.erase((++ri).base() ); 不能對 base 的結果做遞減操作,先遞增 ri,再呼叫 base() 函式。

第 29 條:對於逐個字元的輸入請考慮使用 istreambuf_iterator。

如果你需要從一個輸入流中逐個讀取字元,那麼就不必使用格式化輸入,使用 istreambuf_interator 可獲得明顯的效能改善:直接從流的緩衝區讀取下一個字元。

複製文字檔案的內容到 string:

ifstream inputFile("interestingData.txt");
string fileData((istreambuf_iterator<char>(inputFile)),
                istreambuf_iterator<char>());