使用stl庫的時候一直對value_type這個東西理解的不是很好,可以說就是不理解。今天看了《STL源碼剖析》才恍然大悟。這里稍作記錄。
每個STL中的類都有value_type這種東西,通俗的說value_type 就是stl容器盛裝的數據的數據類型,例如:
vector<int> vec;
vector<int>::value_type x;
上述兩句代碼,第一句是聲明一個盛裝數據類型是int的數據的vector,第二句是使用vector<int>::value_type定義一個變量x,這個變量x實際上是int類型的,因為vector<int>::value_type中聲明的為int型。相應的,假設有:
vector<C> vec; //假設C是自定義類型
vector<C>::value_type x;
那么第二句定義的變量x的數據類型是C。
每個STL容器類(感覺應該是迭代器類更加准確),都有一句相同的代碼:
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;
}