第一章:
前言:
最近想深究一下STL的源码,主要是以前只知道对容器,迭代器,算法,函数对象等怎么使用,但却对其内部机制不甚了解。老话说得好:我们用交通工具,不是因为我们不会走路,而是我们会走路,有复用的工具在那里,因此可以使用。不仅要会用车轮,也要知道车轮内部是怎么工作的。闲话少叙,进入正题吧。
正文:
第一章主要从宏观角度介绍了STL的六大组件。
1)六大组件作用:
容器:存放数据的
迭代器:遍历容器的指针,屏蔽容器的差异性
算法:可以对容器中的数据进行诸如增删改查等操作
仿函数:本质是重载了operator()的类的对象昂
配接器:也就是所谓适配器,有3种。容器适配器是保存容器的接口,主要是queue,stack,priority_queue,
迭代适配器:主要是插入器。函数适配器,主要是对unary和binary函数对象的一些操作。
配置器:进行内存空间的管理。
2)六大组件关系:
算法->迭代器->容器:算法通过迭代器获取容器中的数据,进而对容器中的数据进行操作
适配器->容器:在容器上适配器,就限制了容器的某些特性。例如用栈,只能后进先出,用队列,先进先出。
容器->配置器->数据存储:容器可以通过是配置器来获取数据的储存空间
算法->仿函数:算法依靠仿函数选择某种策略,例如默认小于比较或用户自定义比较等等。
#include
#include
#include
#include
#include
using namespace std;
//模板的一般化
template
class TestClass
{
public:
void test(){cout<<"模板参数为:I;O"<
//模板的偏特化
template
class TestClass
{
public:
void test(){cout<<"模板参数为:M*;M*"<
template
class TestClass
{
public:
void test() {cout<<"模板参数为:const C*,C*"<
//仿函数与算法的搭配使用
template
class Show
{
public:
void operator()(const T& value)
{
cout<<"值为:"<
};
//静态常量直接在类中初始化
template
class MachaoSalary
{
public:
static const long _lSalary = 20000L;
static const long _lHouse = 200L;
};
//increment,decrement,deference等操作
class MaInt
{
friend ostream& operator<<(ostream& os,const MaInt& mi)
{
os<
}
public:
MaInt(int i):_i(i){}
//前置累加符:先累加,再取值
MaInt& operator++()
{
++(this->_i);
return *this;
}
//后置累加符:先取当前值,再累加
const MaInt operator++(int )//无法重载仅按返回类型区分的函数,所以加形参
{
MaInt temp = *this;
++(*this);//调用前置累加函数
return temp;
}
MaInt& operator--()
{
--(this->_i);
return *this;
}
const MaInt operator--(int )
{
MaInt temp = *this;
//--(this->_i);
--(*this);//调用前置累减函数
return *temp;
}
//告诉编译器:要将const int转为非常量值
int& operator*() const
{
return (int&)_i;
}
private:
int _i;
};
template
InputIter ma_find(InputIter first,InputIter last,const T& value)
{
while(first!=last && *first!=value)
{
++first;
}
return first;
}
template
Func ma_for_each(InputIter first,InputIter last,Func f)
{
for(;first!=last;first++)
{
f(first);
}
return f;
}
//仿函数的用法
template
class Multiply
{
public:
T operator()(const T& lhs,const T&rhs)
{
return lhs*rhs;
}
};
int main(int argc,char *argv[]) cout<<"第一回合:测试组态"< cout<<"第二回合:测试偏特化功能"< cout<<"第三回合:临时对象的产生与应用"< cout<<"第四回合:静态常量证书成员在class 内部直接初始化"< cout<<"第六回合:前闭后开区间表示法"< cout<<"第七回合:function call 操作符"<
{
cout<<"STL源码剖析:第一章STL概论与版本简介"<
cout<<"__sgi"<
#ifdef __GNUC__
cout<<"__GNUC__"<
#ifdef __STL_NO_DRAND48
cout<<"I have defined __STL_NO_DRAND48 !"<
cout<<"It is a pity that I have not defined __STL_NO_DRAND48 !"<
#ifdef __STL__CLASS_PARTIAL_SPECIALIZATION
cout<<"I have defined __STL_CLASS_PARTIAL_SPECIALIZATION !"<
cout<<"It is a pity that __STL_CLASS_PARTIAL_SPECIALIZATION !"<
TestClass
TestClass
tcObj1.test();
tcObj2.test();
tcObj3.test();
//for_each(cArr,cArr+6,Show
for_each(cArr,cArr+6,Show
cout<<"第五回合:increment;decrement;dereference操作符"<
cout<
cout<<"使用仿函数的值是:"<
return 0;
}