作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] C++中iterator的疑問
時間Sun Mar 13 21:18:01 2011
※ 引述《nightcola (真實之眼)》之銘言:
: 首先感謝各位先進的回覆!
: 目前的認知是, string * 跟 iterator 雖然概念上相同, 但是實際上在實做上是不同的
: , 也就導致這兩個型態無法相容使用.
: 但是我在書上有看到一個範例:
: vector<string> svec;
: string sarray[4] = {"A","B","C","D"};
: svec.insert(svec.end(), sarray, sarray+4);
: 為何這樣子的例子就可以成功執行, 因為sarray 不也是個 string * 嗎?
: 卻可以套用到型態為 iterator 的參數上?
: 先謝謝各位了 :) , 問題如果問的太淺, 敬請包涵 :)
撰寫泛型程式時, 對於呼叫時會傳入的型別引數細節並不清楚,
但是可以利用程式碼來說明你需要參數提供給你的
操作需求.
特定
操作需求的集合可以抽象化成一個
Concept, 但Concept並不
是某種特定型別.
如果
某一個型別迎合了Concept的操作需求, 稱此型態
Models了
該Concept.
STL 主要是透過迭代器來對容器作操作, 這些迭代器的型別是什
麼並不重要, 你只需要知道他們各自 Models 了以下 5 種 Con-
cepts 的其中之一:
1.InputIterator 2.OutputIterator
3.ForwardIterator
4.BidirectionalIterator
5.RandomAccessIterator
(詳見
http://ppt.cc/Ppf0 http://ppt.cc/-hdK )
之後就可以靠編譯器幫我們做引數推導產生不同的多載函式版本
string* 是 pointer to non-const, 對它可以做的操作有很多,
剛好迎合了 RandomAccessIterator 的需求, 若一個型別Models
了一個 RandomAccessIterator, 那它必然 Models 了其他 4種
Concepts(因為操作需求集合的包含關係).
────────────────────────────
再來回頭看 vector<T>::insert 的 signature, 有以下 3 種:
iterator insert ( iterator position,
const T& x );
void insert ( iterator position, size_type n,
const T& x );
template <
class InputIterator>
void insert ( iterator position, InputIterator first, InputIterator last );
前兩種版本都只能傳和 vector<T>::iterator同樣型別的物件,
也就是 vector<T>內用來實作迭代器的特定型別; 但是對於不符
合的其他型別, 編譯器會透過第 3個模板為你產生一個新的函式
, 但前提是他們都要 Model 'InputIterator'這個 Concept, 否
則編譯器在語法檢查上就不會讓你過.
string sarray[4] = {"A","B","C","D"};
svec.insert(svec.end(), sarray, sarray+4);
你傳入的第2個引數是 string[4], 但是該模板是以 by value的
方式來接受, 具現化出函式的參數型別則會變成 string*, 第 3
個引數因為做了數值運算, 直接decay成指標, 結果如下:
void insert ( iterator position, string *first, string *last );
型別是什麼倒不重要, 對 insert 而言它在乎的是 string*能提
供的操作, 尤其是 first 跟 last必須可以比較相等與否, 以及
提取出來的物件必須可用來放在 assign operator 的右邊等等.
..
────────────────────────────
補上最近教學的心得
在大學 3 學分的課程中, 好像根本不可能教完 STL algorithms
& containers的重要概念...
--
◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█
T-ara版怎麼去
████◤
██
◢██◣█
██
████
██
s ~>
T-ara
█/███
██
██
██
█/█ ◢█
██
█/█ 歡迎您的光臨
████◤
██
██
██
██◤
███◤
██◤
恩靜、
智妍、
孝敏
█/███
██
█/█
█◤
██
█/██
██
素妍、
居麗、
寶藍
████◤
█◤
◥██◤ █◤
████◤
█◤
花英 ψmakigoto123
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
推 purpose:強帖 03/13 21:32
※ 編輯: loveme00835 來自: 140.121.197.115 (03/13 21:38)
推 nightcola:受教了, 看來我還有很長的路要走 :) 03/13 22:08
→ nightcola:我會再細細品味您文章中提及的一些關鍵字, 再次感謝! 03/13 22:09
推 softwind:GOOD! 03/13 22:17
推 nowar100:推 03/13 23:52
推 Yshuan:唸完4年資工 不知道STL的一堆 03/14 14:22