C++ STL 学习笔记 – 简介

1、始于1989年,1997年完成,历时大约10年,标准程序库是C++标准规格的一部分,提供一些列的核心组件,用以支持IO、字符串、容器(数据结构)、算法(排序搜索合并等)、国别等主题。

2、不同组件背后有不同的设计理念,比如String class和STL差别,后者是一个数据结构和算法的Framework,String class是被设计为安全易用,接口不言自明,并可以做许多错误检测,而STL的设计目标是将不同的算法和数据结构结合在一起,并获取最佳的效率,所以并不是很方便,也不检验许多逻辑错误,所以必须通晓其概念原理才可以有效使用。

二、Template模板

1、Nontype Template 参数(非型别模板参数)

型别(type)可以作为Template的参数,非型别(nontype)也可以,比如bitset<>, 其中bit的位数以Template参数指定,

如:bitset<32> flag32;   bitset<50> flag50;

即是用非型别(nontype)来初始化的,由于使用不同的参数,所以两者有不同的类型,不能相互赋值或比较。

2、缺省模板参数   Default template parameters

Template class可以有缺省参数,如

template< class T, class container = vector<T>  >   // 有空格,否则解释成>>
Class MyClass;

如果只传一个参数,则缺省参数可以作为第二个参数使用,

MyClass<int> x1; 等同于

MyClass<int, vector<int> >

3、关键字typename

被用来做型别之前的标识符。如

template <class T>
class MyClass
{
    typename T::SubType * ptr;
    ...
}
这里,SubType是Class T中定义的一个型别,因此,ptr是一个指向T::SubType型别的一个指针
若没有typename关键字,SubType则被解释为一个static成员。于是就变成了T中的一个SubType成员变量与ptr做
乘法了。
例如:
MyClass <Q> x;
的Q类必须有如下定义
class Q
{
    typedef int SubType; // 或者Class SubType
        . . .
}
typename不可或缺,c++的规则就是除了typename修饰以外,Template内的任何标识符号都被视为一个value而非一个type。
4.、Member Template(成员模板)
Template class的member function也可以为Template
如:
class MyClass
{
    ...
    template< class T >
    void fun(T);
};
声明了一个成员函数集,任何型别参数,只要通过型别提供fun用到的所有操作即可。这个特性通常被用来为成员函数提供自动类型转换。
如下定义式:
template <class T>
class MyClass
{
    private:
        T value;
    public :
        void assign( const MyClass<T>& x ) // x must have the same type as *this
        {
                value = x.value;
        }
    ....
};
即是两个型别可以自动转换也不可以,如:
void f()
{
    MyClass<int> ic;
    MyClass<double> dc;

    ic.assign( dc );            // error:!!!!
}
但是可以提供另一个Template来解决精度必须吻合的上述问题:
template <class T>
class MyClass
{
private :
    T value;
public:
    template <class X>
    void assign( const MyClassType<X>& x ) // 允许二者不同
    {
        value = x.getValue();
    }

    T getValue() const
    {
        return value;
    }
    ....

};
Template constructor是Template member的一种特殊形式。用于实现在复制对象时实现隐式转换。
注意,它并不会遮蔽hide 隐式类型转换,如
template <class T>
class MyClass
{
public:
    template <class U>
    MyClass( const MyClass<U>& u  );
    ....
};

void fun()
{
    Myclass<double> xd;
    ...
    MyClass<double> xd2(xd);    // call implicit(build-in) copy constructor
    MyClass<int> xi(xd);       // call template constructor
   ....
}
明白如话。
 

Related posts:

  1. const引用 – 一个C++小问题    今天开始就要进行一个月的嵌入式的培训了。    第一天,复习下C语言的基础知识,老师问了一个关于关键词const的问题。我被提问到,于是我就大致说了一下,估计他也没听懂。    快下课的时候老师写了两行代码,然后什么也没说,直接说这样可以这样不可以。估计他也没懂。    例子是<<C++ Primer>> P49关于const引用的问题。...
  2. Calling Convention – 调用规范(约定) [整理]   转载,原文地址: http://blog.csdn.net/yc_8301/archive/2007/10/08/1814744.aspx 首先,__thiscall是关于类的一种调用方式,它与其他调用方式的最大区别是:    __thiscall对每个函数都增加了一个类指针参数   class   aa     {  ...

以上关联文章由 Yet Another Related Posts Plugin 提供支持。

Tags:

2 Responses to “C++ STL 学习笔记 – 简介”

  1. 赛尔号 说:

    有空我也研究一下

Leave a Reply