仿函数
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.