【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;  
}  


posted @ 2017-09-15 16:06  ZhangPYi  阅读(7896)  评论(0编辑  收藏  举报