看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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