前面一节我们学习了填充算法fill()函数和fill_n()函数,读者是否还记得它们的功能分别是什么吗?没错,fill()函数能对指定序列填充目标元素,fill_n()函数能够指定填充元素的个数。本节我们将继续学习填充算法——generate()函数,”generate“意为“生产”,顾名思义,generate()函数能够通过生成器为序列中的每个元素重新赋值。

generate()函数的语法格式如下:

template< class ForwardIt, class Generator >
void generate( ForwardIt first, ForwardIt last, Generator g );

generate(first,last,g)函数的功能是通过生成器对区间[first,last)所有元素进行一次赋值行为,这里g表示生成器,我们使用Lambda表达式最为直观。下面我们通过代码的方式实操一下generate(first,last,g)函数。

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator> 
#include <cstdlib>  // 需要包含这个头文件
#include <ctime>    // 用于设置随机种子
#include<string>
using namespace std;
/*generate(first,last,g)函数*/
void test() {
	
	srand(time(0));//设计随机数种子 
     
    vector<int> v{1,2,3,4,5}; 
    cout << "未填充前:";
    for_each(v.begin(), v.end(), [](const int& n){
        cout <<n<<  " ";
    });
    cout << '\n';
    /*对v容器内的所有元素进行随机填充*/ 
     generate(v.begin(), v.end(), [](){
        return rand()%100;
    });
    cout << "随机填充后:";
   for_each(v.begin(), v.end(), [](const int& n){
        cout <<n<<  " ";
    });
    
  
} 
int main(){
    system("title dotcpp.com");
    test();
    return 0;
}

编译结果如下:

generate()函数

通过generate(first,last,g)函数我们得到了一个新的序列{34,64,10,23,99},成功通过生成器为v容器内的元素进行重新赋值。

当然,我们并不止步于此,如果我们想要从指定位置开始,为指定个数元素重新赋值,我们就可以使用generate_n()函数。

generate_n()函数语法格式如下:



template< class OutputIt, class Size, class Generator >
OutputIt generate_n( OutputIt first, Size count, Generator g );

generate_n(first,n,g)函数表示从first迭代器开始,通过g生成器为n个元素重新赋值。

下面我们通过代码的方式来实操generate_n(first,n,g)函数:



#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator> 
#include <cstdlib>  // 需要包含这个头文件
#include <ctime>    // 用于设置随机种子
#include<iterator> //用于移动迭代器 
#include<string>
using namespace std;
/*generate_n(first,n,g)函数*/
void test() {
srand(time(0));//设计随机数种子 
     
    vector<int> v{1,2,3,4,5}; 
    cout << "未填充前:";
    for_each(v.begin(), v.end(), [](const int& n){
        cout <<n<<  " ";
    });
    cout << '\n';
    /*从第2个元素开始通过生成器随机赋值3个元素*/ 
     generate_n(next(v.begin(),1), 3, [](){
        return rand()%100;
    });
    cout << "随机填充后:";
   for_each(v.begin(), v.end(), [](const int& n){
        cout <<n<<  " ";
    });
    
  
} 
int main(){
    system("title dotcpp.com");
    test();
    return 0;
}

编译结果如下:

generate_n()函数

通过输出可以看出,对于序列{1,2,3,4,5},我们为除首尾元素的所有元素都进行了随机赋值,输出完全符合我们的预期。

总结,如果我们想要对一个序列进行自定义赋值,我们可以使用generate()函数;如果想要从指定位置开始,为指定个数元素重新赋值,我们可以使用generate_n()函数;同时,generate() 函数常应用于自定义分布数据和生成特殊序列等。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)