STL源码分析学习第一章

第一个要描述的是临时对象,也就是无名对象。刻意制造临时对象的方法就是在类别名称之后加上(),并且可以指定初值
如int(8)等
下面是具体代码

#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
template <typename T>
class print{
	public :
		void operator()(const T& elem){//重载operator()
			cout<<elem<<' ';
		}

};
int main(){
	int ia[6]={0,1,2,3,4,5};
	vector<int>iv(ia,ia+6);
	for_each(iv.begin(),iv.end(),print<int>());
//print()作为一个临时变量被传入for_each for_each结束时 这个临时对象也就结束了它的声明
	
}

由c++的知识我们知道静态变量需要在类的外面初始化,但是这里静态常量的整数成员函数可以直接在class内部初始化,所谓的integral指的是所有的整数类别 不单只是int

#include<iostream>
using namespace std;
template<typename T>
class testClass{
public:
	static const int _datai=5;
	static const long _datal=3L;
	static const char _datac='c';
};
int main(){
	cout<<testClass<int>::_datai<<endl;
	cout<<testClass<int>::_datac<<endl;
	cout<<testClass<int>::_datal<<endl;

}

increment/decement/dereference操作符的实现

#include<iostream>
using namespace std;
class INT{
	friend ostream& operator<<(ostream& os,const INT&i);
public:
	INT(int i):m_i(i){};
	//前向叠加
	INT & operator++(){
	++(this->m_i);
	return *this;
    }
//后向叠加
const INT operator++(int)
	{
	INT temp=*this;
	++(*this);
	return temp;
	}
//前项递减
	INT &operator --(){
	--(this->m_i);
	return *this;
}
//后向递减
const INT operator --(int){
	INT temp =*this;
	--(*this);
	return temp;
}
//引用
int & operator *()const{//类型转换  转换成int类型的引用
return (int &)m_i;
}
private:
	int m_i;
};
ostream & operator<<(ostream & os,const INT&i){
	os<<'['<<i.m_i<<']';
	return os;
}
int main(){
	INT I(5);
	cout<<I++;
	cout<<++I;
	cout<<I--;
	cout<<--I;
	cout<<*I<<endl;//此时已经发生了类型转换  没有使用重载的<< 所以在输出的时候没有[]
	cout<<15<<endl;	

}

这里需要注意的是:运行47行的运行结果没有中括号【】,具体原因在代码中已经说明了
前闭后开区间表示法
[first,last)
整个实际范围是从first开始的,直到last-1,迭代器last指的是“最后一个元素的下一个元素”

function call 操作符 (operator())

#include<cstdlib>
#include<iostream>
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]<<" ";
qsort(ia,sizeof(ia)/sizeof(int),sizeof(int),fcmp);
for(int i=0;i<10;i++)
	cout<<ia[i]<<" ";
	return 0;
}
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;
}
/*

void qsort(
    void *base,
    size_t nmemb,
    size_t size,
    int (*compar)(const void *, const void *)
    );

函数功能:qsort()函数的功能是对数组进行排序,数组有nmemb个元素,每个元素大小为size。

参数base       - base指向数组的起始地址,通常该位置传入的是一个数组名
参数nmemb  - nmemb表示该数组的元素个数
参数size        - size表示该数组中每个元素的大小(字节数)
参数(*compar)(const void *, const void *) - 此为指向比较函数的函数指针,决定了排序的顺序。

*/

仿函数 operator()重载的例子

#include<iostream>
using namespace std;
template<class T>
struct plus1{
    T operator()(const T&x,const T&y)const {return x+y;}
};
template <class T>
struct minus1{
    //由于将operator()重载了 因此plus成立一个仿函数
    T operator()(const T&x,const T&y)const {return x-y;}
};
int main(){
plus1<int>plusobj;
minus1<int>minusobj;
//一下使用仿函数  就像使用一般函数一样
cout<<plusobj(3,5)<<endl;
cout<<minusobj(3,5)<<endl;
//直接产生仿函数的临时对象
cout<<plus1<int>()(43,50)<<endl;
cout<<minus1<int>()(43,50)<<endl;
return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值