看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《singlovesong (~"~)》之銘言: : 請問一下 vector<int>::size_type : 之中的:: 是什麼意思阿? : 我知道一般來說:: 是用來存取global var 或是 static var : 這讓我感覺:: 後面接的應該要是一個變數 : 但是上面 vector<int>::size_type : 的size_type 讓我感覺比較像是int 或是short 的一種資料形態 : 像是用typedef 出來的東西 : 只是為什麼必須要用:: 來存取呢? : vector<int>::size_type 到底是什麼意思 : 跟template 有關嗎 ? 還是跟什麼typename(看不懂)有關呢? : 謝謝! 你可以試想一下,vector 跟 list 或者一些 container, 是不是每個都有 size_type?每個 containter 的 size_type 是否 都有可能不同? vector<int>::size_type 跟 list<int>::size_type 會一樣嗎? 至於 typename,顧名思義,表示他是一種 type 名稱,抄一下人家的 例子: map<T , int> mapTempTable; /* 這部分沒問題, OK! */ map<T, int>::iterator it; /* 編譯器會出錯! */ 第 2個不過是 因為 iterator 應該算 type,沒寫 typename compiler 會 以為 iterator 是 map 的成員變數,導致 compile 不過 再來說 typedef,它是用來定義某個 type 的 alias 比如說: typedef short SmallNumber; // 當你這樣寫得時候, SmallNumber xxx; // 代表這個 xxx 其實就是 short 最後,抄一下某版本 g++ STL 的某段: template <typename _Key, typename _Tp > class map { public: typedef _Key key_type; // 定義 key_type typedef std::pair<const _Key, _Tp> value_type; // 定義 value_type typedef _Rb_tree<key_type, value_type> _Rep_type; typedef typename _Rep_type::iterator iterator; // 定義 iterator } 這邊又是把 _Rep_type::iterator 這個 typename 當作是 iterator, 所以當你寫 std::map<string,string>::iterator 的時候,其實是指向 _Rep_type::iterator,那 _Rep_type::iterator 又是啥?可能就得反覆 trace 下去, template<typename _Key, typename _Val > class _Rb_tree { typedef _Val value_type; typedef _Rb_tree_iterator<value_type> iterator; } 這邊的 value_type,如果你是 std::map<string::string>,那 value_type 就會是 std::pair<string,string> _Rb_tree_iteroatr 則是 struct, template<typename _Tp> struct _Rb_tree_iterator { /* 中間省略 ....*/ } 所以最後結論,其實 map::iterator 最後會轉接給另外一個 class(struct?) 作處理,轉過去的時候還會帶入型別資訊 這是一般慣用的方式,好處是各個不同的 class 可以彼此搭配 share 使用, 每個 class 又可以專注在自己應該要做的事情上 STL 這邊的 code 為了說明我有稍作修改,大概 cut 了一下,沒有 cut 好請見諒 亂 cut 這種東西對我來說是有罪惡感,不過為了方便說明只好出此下策,已經力求 簡單了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.139.15.28 ※ 編輯: cgcheng 來自: 220.139.15.28 (10/01 15:05) ※ 編輯: cgcheng 來自: 220.139.15.28 (10/01 15:05) ※ 編輯: cgcheng 來自: 220.139.15.28 (10/01 15:06) ※ 編輯: cgcheng 來自: 220.139.15.28 (10/01 15:07) ※ 編輯: cgcheng 來自: 220.139.15.28 (10/01 15:10) ※ 編輯: cgcheng 來自: 220.139.15.28 (10/01 15:12)
cgcheng:有打錯字,iterator打成iteraotr所以修改稍多請見諒 10/01 15:20
cgcheng:STL整段code看下來其實還學到不少東西 10/01 15:21
singlovesong:謝謝! 所以class裡面也可以有member 不是資料 10/01 15:52
singlovesong:而是資料形態(type) 第一次知道0.0 10/01 15:52