第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页)
有一对一的友元关系,这时,友元也是模板,而且,在类中的友元声明应该是实例化的,并且实参是类的模板形参。同时,需要前向声明。也可以将模板的每个实例都声明为自己的友元,此时,友元声明是单独的模板声明,并且和对应的类具有不同的模板形参。限定特定的实例作为自己的友元,需要前置声明,并且友元声明是实例化的声明,且模板实参与类的模板形参不同。
空间配置器,容器,迭代器,算法,防函数(函数对象)。空间配置器给容器开辟了放元素的空间;迭代器是算法能够在所有容器上面进行的基础,通过迭代器获取容器的元素;防函数可以使得算法能够按照我们的需求而变化。
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页)
有一对一的友元关系,这时,友元也是模板,而且,在类中的友元声明应该是实例化的,并且实参是类的模板形参。同时,需要前向声明。也可以将模板的每个实例都声明为自己的友元,此时,友元声明是单独的模板声明,并且和对应的类具有不同的模板形参。限定特定的实例作为自己的友元,需要前置声明,并且友元声明是实例化的声明,且模板实参与类的模板形参不同。
相关文章推荐
- 第1章 STL概论与版本简介
- 【STL源码剖析读书笔记】【第1章】STL概论与版本简介
- 【STL源码剖析读书笔记】【第1章】STL概论与版本简介
- STL源代码剖析笔记----第一章STL概论与版本简介
- 1 STL概论与版本简介
- STL源码剖析_读书笔记:第一章 STL概论和版本简介
- 《STL源码剖析》学习笔记系列-----第一章:STL概论和版本简介
- 1 STL概论 版本介绍
- 联想教育应用使用说明(7.6版本)——第1章 联想教育应用方案功能简介
- 联想教育应用使用说明(7.6版本)——第1章 联想教育应用方案功能简介
- STL版本简介
- STL概述与版本简介
- stl空间配置器简介
- LevelDB初探之简单使用 2014-07-28 17:16:18 分类: 大数据 一、简介 LevelDB是google开源的一个key-value存储引擎库,从版本1.2开始就
- NuGet 程序包还原失败: 找不到“2.8.0”版本的程序包“cpprestsdk.v120.winphonesl.msvcstl.dyn.rt-dyn”
- Git(一):Git与版本控制简介
- STL简介
- 一、STL简介
- STL之priority_queue使用简介
- STL算法-------简介