【C/C++开发】STL内嵌数据类型: value_type
使用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;
}