第一章《STL概论》
一.STL六大组件功能与运用
容器 | 各种数据结构vector, list,deque,set,map |
算法 | 各种常用算法sort, search, copy, erase等 |
迭代器 | 扮演容器和算法之间的胶合剂,是所谓的泛型指针 |
仿函数 | 行为类似函数,可以作为算法的某种策略 |
配接器 | 一种用来修饰容器或迭代器或仿函数的东西 |
配置器 | 是一个实现了空间管理,空间配置,空间释放的模板类 |
二.STL六大组件的交互关系
1.容器通过空间配置器取得数据存储空间;
2.算法通过迭代器存取容器内容;
3.仿函数可以协助算法完成不同的策略变化;
4.配接器可以修饰或者套接仿函数;
三.可能令你困惑的C++语法
1.如果class 内含有静态常量整数成员,那么根据C++标准规格,我们可以在class之内直接给予初值。
2.很少有人注意到,函数调用操作(c++语法中的左右小括号)也可以被重载。
3.函数指针的缺点:函数指针无法持有自己的状态,也无法达到组件技术中的可适配性,也就是无法再将某些修饰条件加诸于其上而改变其状态。
-------------------------------------------------关于函数指针的一个代码例子---------------------------------------------------------------------------------
#include<iostream>
#include<cstdlib>
using namespace std;
int fcmp(const void*elem1,const void* elem2);
int main()
{
int ia[10]={32,92,67,58,10,4,25,52,59,54};
for(int i=0;i<10;i++)
{
cout<<ia[i]<<" ";
}
cout<<endl;
qsort(ia,sizeof(ia)/sizeof(int),sizeof(int),fcmp);
for(int i=0;i<10;i++)
{
cout<<ia[i]<<" ";
}
cout<<endl;
}
int fcmp(const void*elem1,const void* elem2)
{
const int* i1=(const int*)elem1;
const int* i2=(const int*)elem2;
if(*i1<*i2)
{
return -1;
}
else if(*i1==*i2)
return 0;
else if(*i1>*i2)
{
return 1;
}
}
运行结果
四.仿函数
为此,STL算法的特殊版本所接受的所谓“条件”或“策略”或“一整组操作”,都以仿函数形式呈现。所谓仿函数就是使用起来像函数一样的东西。如果你针对某个class进行operator()重载,它就成为一个仿函数。
-----------------------------------------------------------将一个operator()重载的例子------------------------------------------------------------------------
#include<iostream>
using namespace std;
template<class T>
struct plusc
{
T operator()(const T&x,const T&y)const
{
return x+y;
}
};
template<class T>
struct minusc
{
T operator()(const T&x,const T&y)const
{
return x-y;
}
};
int main()
{
plusc<int>plusobj;
minusc<int>minusobj;
cout<<plusobj(3,5)<<endl;
cout<<minusobj(3,5)<<endl;
//第一个小括号的作用是创建临时对象,第二个括号的作用是调用函数
cout<<plusc<int>()(1,6)<<endl;
cout<<minusc<int>()(1,6)<<endl;
}
程序运行结果
上面的plusc<T>以及minus<T>已经非常接近STL实现了,唯一的区别在于它缺少“可配接能力”。