《STL源码剖析》阅读笔记---day1

本文介绍了STL(标准模板库)的六大核心组件及其交互作用,包括容器、算法、迭代器、仿函数、配接器及配置器的功能与应用。同时探讨了C++中一些可能令人困惑的语法特性,如静态常量成员的初始化、函数调用操作符的重载等,并提供了仿函数实现的具体示例。

第一章《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实现了,唯一的区别在于它缺少“可配接能力”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值