仿函数

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.

posted @ 2015-07-19 18:59  朽木可雕否  阅读(155)  评论(0编辑  收藏  举报