STL_组态及使用语法

9 篇文章 0 订阅

组态

完成在不同编译环境下,stl 编译所需要的环境
定义一些常量,标识某些组态的成立与否
所有的STL 文件都会直接或者间接的包含这个组态文件,以条件的形式书写,预处理器根据常量决定取舍那一段程序

stl_config.h

文件完成的功能

  1. 如果不编译器没有定义bool, true, false则定义
  2. 如果编译器不支持drand48()(返回[0.0,1.0) 之间的double随机数函数)函数则定义__STL_NO_DRAND48
    注: drand48产生双精度的伪随机数, 因为采用了48bit计算, 故名drand48
  3. 如果编译器不支持static members of template classes(模板类静态成员),则定义__STL_STATIC_TEMPLATE_MEMBER_BUG
  4. 如果编译器不支持’typename’关键字, 则将’typename’定义为空(null macro)
  5. 如果编译器支持partial specialization of class templates(模板类偏特化),则定义__STL_CLASS_PARTIAL_SPECIALIZATION
    参考文献: http://msdn.microsoft.com/en-us/library/9w7t3kf1(v=VS.71).aspx
  6. 如果编译器支持partial ordering of function templates(模板函数特化优先级),则定义__STL_FUNCTION_TMPL_PARTIAL_ORDER参考资料: http://msdn.microsoft.com/zh-cn/library/zaycz069.aspx
  7. 如果编译器支持calling a function template by providing its templatearguments explicitly(显式指定调用模板函数的模板参数)则定义__STL_EXPLICIT_FUNCTION_TMPL_ARGS
  8. 如果编译器支持template members of classes(类模板成员),则定义__STL_MEMBER_TEMPLATES
  9. 如果编译器不支持’explicit’关键字, 则将’explicit’定义为空(null macro)
  10. 如果编译器不能根据前一个模板参数设定后面的默认模板参数,则定义__STL_LIMITED_DEFAULT_TEMPLATES
  11. 如果编译器处理模板函数的non-type模板参数类型推断有困难,则定义__STL_NON_TYPE_TMPL_PARAM_BUG
  12. 如果编译器不支持迭代器使用’->'操作符,则定义__SGI_STL_NO_ARROW_OPERATOR
  13. 如果编译器(在当前编译模式下)支持异常,则定义__STL_USE_EXCEPTIONS
  14. 如果我们将STL放进命名空间中,则定义__STL_USE_NAMESPACES
  15. 如果本STL在SGI的编译器上编译, 并且用户没有选择pthreads或者no threads,则默认使用__STL_SGI_THREADS 注: POSIX thread 简称为pthread, Posix线程是一个POSIX标准线程.
  16. 如果本STL在Win32平台的编译器上使用多线程模式编译,则定义__STL_WIN32THREADS
  17. 适当的定义命名空间相关的宏(__STD, __STL_BEGIN_NAMESPACE, 等)
  18. 适当的定义异常相关的宏(__STL_TRY, __STL_UNWIND, 等)
  19. 根据是否定义__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() 进行重载,这个类就是仿函数,可以通过编码使仿函数变为可配接的

对象当做函数名
仿函数与函数指针相比的优势
一个类,是数据以及对数据操作的行为的集合,而我们现在的函数对象,只拥有方法,而没有使用它的数据,但是在函数指针,是无法保存数据的,所以,函数对象比函数指针功能更强,因为它可以保存数据,这一特性,是函数指针无法比拟的优势。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老黑675

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值