Effective STL 筆記-第4章 迭代器
阿新 • • 發佈:2021-08-19
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>());