作者cgcheng (..)
看板C_and_CPP
標題Re: [問題] vector<int>::size_type
時間Sat Oct 1 15:02:25 2011
※ 引述《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