zoukankan      html  css  js  c++  java
  • 【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;  
    }  


  • 相关阅读:
    有一个双重模板化的错误实现
    非类型模板参数
    C++模板
    初始化列表initializer_list
    C++类型转换
    const引用和constexpr
    逆元
    卡特兰数
    最短路问题
    Android打印机效果的闪屏
  • 原文地址:https://www.cnblogs.com/huty/p/8517000.html
Copyright © 2011-2022 走看看