填充整个区间(fill,fill_n,generate和generate_n)

时间:2023-03-09 09:38:14
填充整个区间(fill,fill_n,generate和generate_n)

fill

  将value值填充整个区间,不能为OutputIterator,因为fill会用到first和last,outputIterator无法做相等的测试

template <class ForwardIterator, class T>
void fill( ForwardIterator first, ForwardIterator last,const T& value);

fill_n

  会将数值value填充[first,first+n),返回值为first+n,可以用outputIterator

template <class OutputIterator,class size,class T>
OutputIterator fill_n( OutputIterator first, OutputIterator last,size n,const T& value);

generate

template <class ForwardIterator, class Generator>
void generate ( ForwardIterator first, ForwardIterator last, Generator gen )
{
    while (first != last)
    {
        *first = gen();
        ++first;
    }
}

  该函数是使用gen函数产生的值填充范围内元素的值。参数gen是一个接受空参数,并返回一个对应的值的函数或者是函数对象之类的。

generate_n

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

  返回值是first+n,generate和generate_n中的gen会被调用n(或first+n)次,而非只在循环外调用一次,这一点很重要,因为Generate不一定会在每次调用时候都返回相同的结果,因此generate允许从文件读入,取局部状态的值并更改。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

class F
{
    private:
        static int i;
    public:
        int operator()()
        {
            return ++i;
        }
};
;

int main()
{
    vector<);
    generate(v.begin(),v.end(),rand);//调用c语言中的rand函数,填满v
    generate_n(v.begin(),,F());//调用函数对象
    for(auto i:v)
        cout<<i<<' ';
    cout<<endl;
    ;
}