Re: [問題] C++中iterator的疑問

看板C_and_CPP (C/C++)作者 (朴髮箍)時間15年前 (2011/03/13 21:18), 編輯推噓5(501)
留言6則, 5人參與, 最新討論串3/3 (看更多)
※ 引述《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

03/13 21:32, , 1F
強帖
03/13 21:32, 1F
※ 編輯: loveme00835 來自: 140.121.197.115 (03/13 21:38)

03/13 22:08, , 2F
受教了, 看來我還有很長的路要走 :)
03/13 22:08, 2F

03/13 22:09, , 3F
我會再細細品味您文章中提及的一些關鍵字, 再次感謝!
03/13 22:09, 3F

03/13 22:17, , 4F
GOOD!
03/13 22:17, 4F

03/13 23:52, , 5F
03/13 23:52, 5F

03/14 14:22, , 6F
唸完4年資工 不知道STL的一堆
03/14 14:22, 6F
文章代碼(AID): #1DVCGBOe (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DVCGBOe (C_and_CPP)