1、基本介绍:
STL:C++的程序库,建立的数据结构与算法的一套标准
核心思想:复用性的提升,复用性必须建立在某种标准之上
2、STL六大组件:
这是我我电脑上stl_config.h文件夹的部分内容
以下是测试代码:
#include
#include
#include
using namespace std;
int main()
{
#if defined(__sgi)
cout << "__sgi" << endl;
#endif // defined(__sgi)
#if defined(__GUNC__)
cout << "__GUNC__" << endl;
cout << __GUNC__<< ' ' << __GUNC_MINOR__ << endl;
#endif // defined(_GUNC_)
#ifdef __STL_NO_DRAND48
cout << "_STL_NO_DRAND48 defined" << endl;
#else
cout << "_STL_NO_DRAND48 undefiend" << endl;
#endif // _STL_NO_DRAND48
#ifdef __STL_STATIC_TEMPLATE_MEMBER_BUG
cout << "_STL_STATIC_TEMPLATE_MEMBER_BUG defined" << endl;
#else
cout << "_STL_STATIC_TEMPLATE_MEMBER_BUG undefined" << endl;
#endif // _STL_STATIC_TEMPLATE_MEMBER_BUG
#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
cout << "_STL_CLASS_PARTIAL_SPECIALIZATION defined" << endl;
#else
cout <<"_STL_CLASS_PARTIAL_SPECIALIZATION undefined" << endl;
#endif
#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
cout << "_STL_FUNCTION_TMPL_PARTIAL_ORDER defined" << endl;
#else
cout << "_STL_FUNCTION_TMPL_PARTIAL_ORDER undefined" << endl;
#endif
#ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
cout << "_STL_EXPLICIT_FUNCTION_TMPL_ARGS defined" << endl;
#else
cout << "_STL_EXPLICIT_FUNCTION_TMPL_ARGS undefined" << endl;
#endif
#ifdef __STL_MEMBER_TEMPLATES
cout << "__STL_MEMBER_TEMPLATES defined" << endl;
#else
cout << "__STL_MEMBER_TEMPLATES undefined" << endl;
#endif
#ifdef __STL_LIMITED_DEFAULT_TEMPLATES
cout << "__STL_LIMITED_DEFAULT_TEMPLATES defined" << endl;
#else
cout << "__STL_LIMITED_DEFAULT_TEMPLATES undefined" << endl;
#endif
system("PAUSE");
return 0;
}
在Ubuntu条件下测试全为undefined的,大概是测试方法问题,使用Cyswin B20测试,但是测试环境没有搭建好,无法输出
4、可能令你困惑的C++语法
(1)stl_config.h中的各种组态:
在《STL源码剖析》中,举了几个例子,实际上就是测试编译器对这些组态的支持程度。这里仅以_STL_STATIC_TEMPLATE_MEMBER_BUG做一下举例说明,这个的意思是编译器是否接受静态成员的初值设定
测试代码:
#include
using namespace std;
template
class TestClass{
public:
static int data;
};
template<> int TestClass::data = 1; //书上此处代码错了
template<> int TestClass::data = 2;
int main()
{
//Testing enviorment:ubuntu gcc
cout << TestClass::data<::data<
余下的集中组态,也可以按照组态表达的意思(看英文),设计合适的测试对编译器是否支持该组态进行测试。目前由于姿势水平不够,在后期的学习中将对组态进行更进一步的阐述,目前先到这里了解概念。
(2)临时对象的产生以及运用:临时对象就是一种无名对象,出现不在程序员的预期内(比如pass by value引起的copy操作,形成了一个临时对象),往往会造成效率上的负担。但是有时刻意的使用临时对象,是一个是程序很爽的技巧。
刻意制造临时对象:在类型名称之后直接加一对小括号,指定初值,如shape(3, 5),其意义箱单于调用相应的constructor且不指定对象名称。STL最常将此技巧应用于仿函数与算法搭配上
(3)静态常量整数成员在class内部直接初始化:如果class内含const static type data member,那么根据C++标准规格,我们可以在class之内直接给予初值。
(4)increment/decrement/dereference操作符
increment/dereference 操作符在迭代器的实现上占有非常重要的地位,因为任何一个迭代器都必须实现出前进(increment,operator++)和取值(dereference,operator*)功能,前者还分为前置式(prefix)和后置式(postfix)两种。其实就是++a,--a,以及取值操作符*
(5)前闭后开区间表示法[ ):任何一个STL算法,都需要获得由一对迭代器(泛型指针)所标示的区间,用以表示操作范围。这一对迭代器所标示的是个所谓的前闭后开的区间,以[first, last)表示。也就是说,整个实际范围从first开始,知道last - 1。迭代器last并不含元素,它指的的是“最后一个元素的下一个位置”。这标示法叫off by one(或说是pass yje end),一个小技巧。
用过C++容器都知道,Iterator遍历整个容器,一般是从begin()开始到end()
(6)function call操作符( operator() )
函数调用操作(左右小括号)也可以被重载