数据结构与C++stl(2) 仿函数
2014-07-30 17:40
197 查看
在C++中,类的使用是非常常用的,形如int i;i=100;编译器为我们提供了int型的赋值操作符,但是在C++的类中呢,事实上,CList<int> lst;lst=lst2;这样的写法是正确的,但是结果呢,我们知道链表的内部实现是结构体指针,那么编译器回味我们做些什么呢,编译器会将lst2的值也就是数据成员全部拷贝到lst之中,那么这样就是错误的了,因为指针的直接赋值是假赋值,即两个相同的指针指向同一块内存空间,那么lst2.Delete(i);lst也会被删除,所以
我们必须使用赋值操作符来改写编译器为我们默认的赋值操作符,因为它涉及到了内存分配,operator=是一个C++成员函数,调用的过程是lst.operator=(lst2);operator是一个可以变形的函数,那么operator()又是什么呢。其实这就是仿函数
我们可以写下如下代码 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()返回的值则是迭代器
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()返回的值则是迭代器
相关文章推荐
- C++数据结构与STL--递归--汉诺塔
- c++ 数据结构之STL之 map
- C++数据结构与STL--有序表,删除表重复项
- C++数据结构与STL--栈的应用--后缀表达式的计算
- 数据结构_7:图算法 :c++/STL
- C++数据结构与STL--二分查找
- C++数据结构与STL--双向循环链表(实现自定义iterator类)
- c++STL 数据结构之queue队列应用
- C++数据结构与STL--栈的实现
- C++数据结构与STL--选择排序
- C++数据结构与STL--递归--进制转换
- C++ STL的底层数据结构都是啥
- c++练习004之数据结构(顺序表操作)
- C++ 与 C#数据结构类型对应关系表
- cstl -- c语言编写通用数据结构和常用算法库(模仿SGI STL)
- 数据结构与算法C++版(笔记)
- C++容器&数据结构
- 数据结构之单链表 C++ 实现
- C++实现数据结构作业——表达式求值
- 关于C++二进制文件读取转换,数据版本升级,增加字段等结构调整工具的思路。