数据结构与C++stl(2) 仿函数

在C++中,类的使用是非常常用的,形如int i;i=100;编译器为我们提供了int型的赋值操作符,但是在C++的类中呢,事实上,CList<int> lst;lst=lst2;这样的写法是正确的,但是结果呢,我们知道链表的内部实现是结构体指针,那么编译器回味我们做些什么呢,编译器会将lst2的值也就是数据成员全部拷贝到lst之中,那么这样就是错误的了,因为指针的直接赋值是假赋值,即两个相同的指针指向同一块内存空间,那么lst2.Delete(i);lst也会被删除,所以

CList<T>&::operator=(const CList<T>& org)
{
if(*this!=org){
//这里要进行内存分配
}
return *this;
}


我们必须使用赋值操作符来改写编译器为我们默认的赋值操作符,因为它涉及到了内存分配,operator=是一个C++成员函数,调用的过程是lst.operator=(lst2);operator是一个可以变形的函数,那么operator()又是什么呢。其实这就是仿函数

template<class T>
class greater_value
{
private:
T _num;
greater_num(T num):_num(num){}
bool operator()(const T& tht){return tht>_num} }; //operator()函数一种可以将类像函数调用一样的C++特性

template<class Iter,class Pre>
Iter find_if(Iter beg,Iter end,Pre p)
{
for(;beg!=end;++beg)
     if(p(*beg))
        return beg;
return end;
};

我们可以写下如下代码 if((list<Data>::iterator it=find_if(lst.begin(),lst.end(),greater_value(Data("2014-7-30"))))!=lst.end())cout<<*it<<endl;

因为是模版类,我们可以实例化类类型,因为是类类型,可以添加operator>函数,然后添上仿函数和模版函数,就可以运作了,事实上,这也是stl的运作,数据结构类容器提供了数据的集合,迭代器提供了类似指针的操作,而算法则高效的操纵数据,仿函数成了高效的方法,在上述代码中,greater_value就是仿函数,一个包含operator()的类,find_if即为算法,一个在某些条件符合下查找的算法,而该函数中实例化的Iter,以及lst.begin()返回的值则是迭代器



 

猜你喜欢

转载自blog.csdn.net/anzijian1993/article/details/38304241