您的位置:首页 > 其它

第1章 STL概论与版本简介

2018-03-25 16:06 232 查看
STL六大组件
    空间配置器,容器,迭代器,算法,防函数(函数对象)。空间配置器给容器开辟了放元素的空间;迭代器是算法能够在所有容器上面进行的基础,通过迭代器获取容器的元素;防函数可以使得算法能够按照我们的需求而变化。
STL的各种组态(其实就是各种模板的语法,在C++Primer第16章都有讲,编译环境:G++ 5)

   _STL_STATIC_TEMPLATE_MEMBER_BUG
            这个是模板静态成员。比如下面这个类://处理类模板的静态成员

template<typename T>
class A
{
public:
static void fun();
static int i;
}在类外定义两个静态成员://由于成员也是模板,因此在类外定义需要加上template<>
template<typename T>
void A::fun() {
cout<<"A<T>::fun()"<<endl;
}
template<typename T>
int A::i=0;再定义两个特化的版本//书中没有加上template<>,这里是有错误的,C++primer(5th)第594页
template<>
void A<int>::fun() {
cout<<"A<int>::fun()"<<endl;
}
template<>
int A<int>::i=1;主函数int main()
{
A<char> ac;
ac.fun();//void A<T> fun
cout<<A<char>::i<<endl;//0

A<int> ai;
ai.fun();//void A<int> fun
cout<<A<int>::i<<endl;//1
}  _STL_CLASS_PARTIAL_SPECIALIZATION
        模板偏特化(C++Primer(5th) 第624页)
        函数模板是不能够偏特化的,必须为每一个模板参数都提供实参。类模板可以偏特化,这里不仅提供部分模板参数实参,而且可以特例化指针版本和指向常量的指针版本,注意这里没有const point版本,因为顶层const会忽略,同时也可以定义引用版本。
_STL_NON_TYPE_TEMP_PARAM_BUG
    非类型模板参数(C++Primer(5th)第580页)。1 整型,并且绑定到非类型整型参数只能是常量表达式,在编译器就可以得到值的。2 指向对象或者函数的指针或引用。绑定到指针或引用的实参必须具有静态的生存期(全局变量或者静态变量)。
        非类型模板参数——整型//用函数模板示例,类模板一样
//非类型模板参数 整型

#include <iostream>
using namespace std;

template<int N>
void fun_int() {
cout<<"fun_int<"<<N<<">"<<"()"<<endl;
}

const int CI=3;
int I=4;
int main()
{
int i=1;
const int ci=2;
fun_int<i>();//错误,i不是常量表达式
fun_int<1>();//正确,右值符合常量表达式的特点 1 值不会改变 2 在编译期就能得到其值
fun_int<ci>();//正确,ci是常量表达式
fun_int<CI>();//正确
fun_int<I>();//错误
}非类型模板参数  指针
对于引用也是一样的
//传递给指针或引用的实参必须具有固定的地址(类似与整型的常量表达式),而且指向的要是外部对象(传同名对象的时候,模板能够实例化同样的函数或类)
template<const char *p>
void fun_point() {
cout<<"void fun_point<const char *p>()"<<" "<<*p<<endl;
}

const char *s="hello";
char c='c';
char *const cp=&c;
extern char const cs[]="hello";
char a[]="hello";
int main()
{
 //fun_point<s>();//这里s是变量,直到运行期才能知道,因此错误
//fun_point<cp>();//cp是常量指针,是一个内部对象
fun_point<cs>();//使用extern const压制了const的内部链接属性
fun_point<a>();//这里a是数组名,数组名具有固定地址,因为不能给数组名赋值
fun_point<&c>();//正确,c是外部对象,c是全局对象,具有固定地址
//有个疑问,为什么在cp加上关键字extern还是不对,想不明白
 }友元和模板(C++Primer(5th)第589页)
    有一对一的友元关系,这时,友元也是模板,而且,在类中的友元声明应该是实例化的,并且实参是类的模板形参。同时,需要前向声明。也可以将模板的每个实例都声明为自己的友元,此时,友元声明是单独的模板声明,并且和对应的类具有不同的模板形参。限定特定的实例作为自己的友元,需要前置声明,并且友元声明是实例化的声明,且模板实参与类的模板形参不同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: