组态
完成在不同编译环境下,stl 编译所需要的环境
定义一些常量,标识某些组态的成立与否
所有的STL 文件都会直接或者间接的包含这个组态文件,以条件的形式书写,预处理器根据常量决定取舍那一段程序
stl_config.h
文件完成的功能
- 如果不编译器没有定义bool, true, false则定义
- 如果编译器不支持drand48()(返回[0.0,1.0) 之间的double随机数函数)函数则定义__STL_NO_DRAND48
注: drand48产生双精度的伪随机数, 因为采用了48bit计算, 故名drand48 - 如果编译器不支持static members of template classes(模板类静态成员),则定义__STL_STATIC_TEMPLATE_MEMBER_BUG
- 如果编译器不支持’typename’关键字, 则将’typename’定义为空(null macro)
- 如果编译器支持partial specialization of class templates(模板类偏特化),则定义__STL_CLASS_PARTIAL_SPECIALIZATION
参考文献: http://msdn.microsoft.com/en-us/library/9w7t3kf1(v=VS.71).aspx - 如果编译器支持partial ordering of function templates(模板函数特化优先级),则定义__STL_FUNCTION_TMPL_PARTIAL_ORDER参考资料: http://msdn.microsoft.com/zh-cn/library/zaycz069.aspx
- 如果编译器支持calling a function template by providing its templatearguments explicitly(显式指定调用模板函数的模板参数)则定义__STL_EXPLICIT_FUNCTION_TMPL_ARGS
- 如果编译器支持template members of classes(类模板成员),则定义__STL_MEMBER_TEMPLATES
- 如果编译器不支持’explicit’关键字, 则将’explicit’定义为空(null macro)
- 如果编译器不能根据前一个模板参数设定后面的默认模板参数,则定义__STL_LIMITED_DEFAULT_TEMPLATES
- 如果编译器处理模板函数的non-type模板参数类型推断有困难,则定义__STL_NON_TYPE_TMPL_PARAM_BUG
- 如果编译器不支持迭代器使用’->'操作符,则定义__SGI_STL_NO_ARROW_OPERATOR
- 如果编译器(在当前编译模式下)支持异常,则定义__STL_USE_EXCEPTIONS
- 如果我们将STL放进命名空间中,则定义__STL_USE_NAMESPACES
- 如果本STL在SGI的编译器上编译, 并且用户没有选择pthreads或者no threads,则默认使用__STL_SGI_THREADS 注: POSIX thread 简称为pthread, Posix线程是一个POSIX标准线程.
- 如果本STL在Win32平台的编译器上使用多线程模式编译,则定义__STL_WIN32THREADS
- 适当的定义命名空间相关的宏(__STD, __STL_BEGIN_NAMESPACE, 等)
- 适当的定义异常相关的宏(__STL_TRY, __STL_UNWIND, 等)
- 根据是否定义__STL_ASSERTIONS, 将__stl_assert定义为断言或者空(null macro)
C++ 一些特殊语法
临时对象产生与运用
临时对象是一种无名对象,出现如果不是是在预期内的话会对,效率上产生负担
可以制造一些临时对象可能会使程序干净清爽
制造方法:在型别名称后面直接加一对小括号,而且可以指定初始值
意义:调用constructor(构造函数) 并且不指定对象名
STL 中将临时对象技巧用于仿函数(重载一对小括号)与算法搭配
临时对象做参数传入,临时对象生命虽函数结束而结束
静态常量整数成员在类内直接初始化
static const 整形类别变量=直接初始化
前闭后开区间表示法[)
任何STL 算法都需要获得由一对迭代器(泛型指针)所表示的区间,表示操作范围,这一对所表示的区间是前闭后开的,[first ,lasr) 表示 first 到 last - 1
last 迭代器表示的是 最后一个元素的下一个位置
function call(函数调用) 操作符(operator())
C++ 中函数调用操作符一对小括号,也是可以被重载的
许多STL 算法都提供两个版本
用于一般情况:例如排序以递增形式排序
用于特殊情况:例如排序时由使用者指定以何种关系进行排序
向指定排序方式这种操作一般代表一整组操作
代表一整组操作的就是函数了
在C语言中函数作为参数只能通过函数指针
但是函数指针使用时优缺点:1. 无法持有自己的状态,2. 不具有组件技术中需要的适配性——无法再将某些修饰条件加诸于其上二改变其状态
STL 算法的特殊版本所接受的所谓条件或策略或一组操作,都是以仿函数的形式呈现的
仿函数
使用起来像函数一样的东西
使用:对类进行operator() 进行重载,这个类就是仿函数,可以通过编码使仿函数变为可配接的
对象当做函数名
仿函数与函数指针相比的优势
一个类,是数据以及对数据操作的行为的集合,而我们现在的函数对象,只拥有方法,而没有使用它的数据,但是在函数指针,是无法保存数据的,所以,函数对象比函数指针功能更强,因为它可以保存数据,这一特性,是函数指针无法比拟的优势。