您的位置:首页 > 其它

仿函数

2015-07-19 18:59 435 查看
template<typename T >
struct Compare{
bool operator()(const T & ele1,const T &ele2){
return ele1 < ele2;
}
};


1 . 仿函数可用于排序准则

例:

// Settest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <set>
#include <iostream>
#include <algorithm>
#include <functional>

using namespace std;

template<typename T > struct Compare{ bool operator()(const T & ele1,const T &ele2){ return ele1 < ele2; } };

int main(int argc, char* argv[])
{
typedef multiset< int ,Compare<int> > Set; //容器插入时的比较准则
Set iset;
iset.insert(2);
iset.insert(1);
iset.insert(3);
iset.insert(3);

ostream_iterator<int> out(cout," ");
copy(iset.begin(),iset.end(),out);
return 0;
}


2 . 拥有内部状态的仿函数

template<typename T >
struct IntSequence{
IntSequence(int i):m_i(i){}
int operator()(){
return m_i++;
}
int m_i;
};

int main(int argc, char* argv[])
{

list<int> ilist;
generate_n(back_inserter(ilist),5,IntSequence<int>(1));
ostream_iterator<int> out(cout," ");
copy(ilist.begin(),ilist.end(),out);
return 0;
}


  这个有如下几个地方注意

1.generate_n

template<class OutputIterator,class Size,class Generator>
OutputIterator generate_n(OutputIterator first,Size n,Generator gen){
for( ; n> 0; --n,++first){
*first = gen();
}
return first;
}


在内部每次调用了 Generator重载的()函数(每次调用作用于生成的gen对象,仿函数保存状态), 也调用了 OutputIterator重载的=函数,

2 OutputIterator重载的=函数

insert iterators包括back_insert_iterator,front_insert_iterator和insert_iterator。主要观念是,每个insertiterators内部都维护有一个容器;容器有自己的迭代器,当客户端对insert iterators做赋值操作时,就在insert iterators中转为对该容器的迭代器做插入操作,其他的迭代器功能则被关闭。

在insert iterators的operator=操作转化为调用底层容器的push_back()或push_front()或insert()操作函数

小结:generate或generate_n在对还未定下size的容器进行生成时,使用list.back_iterator.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: