使用stl庫的時候一直對value_type這個東西理解的不是很好,能夠說就是不理解。今天看了《STL源碼剖析》才恍然大悟。這裏稍做記錄。css
每一個STL中的類都有value_type這種東西,通俗的說value_type 就是stl容器盛裝的數據的數據類型,例如:html
vector<int> vec;ios
vector<int>::value_type x;spa
上述兩句代碼,第一句是聲明一個盛裝數據類型是int的數據的vector,第二句是使用vector<int>::value_type定義一個變量x,這個變量x其實是int類型的,由於vector<int>::value_type中聲明的爲int型。相應的,假設有:htm
vector<C> vec; //假設C是自定義類型對象
vector<C>::value_type x;源碼
那麼第二句定義的變量x的數據類型是C。it
每一個STL容器類(感受應該是迭代器類更加準確),都有一句相同的代碼:io
typede T value_type;模板
其中T則是類模板中使用的參數 :
template <class T>
以STL的list容器爲例,那麼它的類定義就應該有下面的語句:
template<class T>
class list{
publict:
typedef T value_type;
//……
};
上述寫法,在《STL源碼剖析》中稱爲「聲明內嵌型別」技術。
這樣一來咱們就知道value_type是個什麼東西了。接下來就是怎麼用啦。
這裏要說個人老師真的不怎麼滴,對語句
template <class T>
的解釋實在是太膚淺啦。我如今也是豁然開朗,這個關鍵就是class T。竟然這個T能夠是一個class,那麼value_type也就是能夠用來定義class的對象了。因此就能夠有下面代碼的用法啦:
#include <list> #include <vector> #include <iostream> using namespace std; class C{ public: C(int x){ cout << x << endl; } C(){ cout << 10 << endl; } }; void main(){ vector<C> vec; C c1,c2(11); vec.push_back(c1); vec.push_back(c2); vector<C>::value_type n1; vector<C>::value_type n2(13); vec.push_back(n1); vec.push_back(n2); cout << vec.size() << endl; }