* Difference between std::generate and std::generate_n

来自:http://blog.csdn.net/yunccll/archive/2009/09/05/4517957.aspx

1. 问题:
   常常,我们编写C++程序时,需要产生 前 n 个连续的 序列:例如:1-10, 3-20 等等序列,

2. 方案
 马上想到的解决方案是:自定义一个按照顺序产生序列的 Generator,然后调用std::generate函数来产生序列并存储至容器中。

3. 资源:
  STL为我们提供了 2个generate 函数:std::generate 和 std::generate_n。如下是两个函数的声明:

1. template <class ForwardIterator, class Generator>
   void generate(ForwardIterator first, ForwardIterator last, Generator gen);
   2. template <class OutputIterator, class Size, class Generator>
   OutputIterator generate_n(OutputIterator first, Size n, Generator gen);

3.1 资源说明:

相同:两个函数都是:在一个range 内,每次调用Generator生成一个值,输出到指定的Iterator指向的range 中;

区别:两个函数需要的range不一样,

std::generate需要两个 ForwardIterator来提供range,输入和输出range都是[First, Last),所以在输入Iterator存在之前,Container的实际内容必须存在;generator实际执行的是覆盖操作(overwrite);而不是 insert操作.

反观std::generate 需要的参数是 OutputIterator 和 一个 N;输入range为:[0, N),输出range为:[OutputIterator, OutputIterator+N);此时输入range不需要Conatiner的存在就可以确定,所以Container的实际内容不需要存在;另外,STL提供了Insert Adapter for OutputIterator,使用Inserter,即可添加新序列至container中。

4. 结论:
  在使用变长容器时,使用 std::generate_n (Insert Adapter , N, Gen)可以提高效率。
  使用固定长度的容器时,容器的值肯定存在,两个函数的效率没区别;但是generate对容器提供的Iterator要求是:ForwardIterator 或其强化(refinement)

class Incr{ public: Incr(int num = 0) : m_num(num){} int operator () () {return ++m_num;} private: int m_num; }; // using std::generate & vector || int iarr std::vector<int> ivec[gen_len]; std::generate(ivec.begin(), ivec.end(), Incr());//overwrite int iarr[gen_len]; std::generate(iarr, iarr+gen_len, Incr());//overwrite // using std::generate_n & vector std::vector<int> ivec; std::generate_n(back_inserter(ivec), gen_len, Incr()); // inserter int iarr[gen_len]; std::generate_n(iarr, gen_len, Incr());//overwrite

* std::generate_n

来自:http://huycwork.blog.163.com/blog/static/136751999201032162244522/

原型:

 #include <algorithm> void generate_n( output_iterator result, SIZE num, Generator g );

函数generate_n()驱动动作类Generator对象g运行num次, 将运行结果保存在result, result+1, ..., result+num.

例如, 下面的代码使用generate_n()将C标准库函数rand产生的随机数填充一个int类型的数组:

 #include <cstddef>
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <algorithm>
int main() {
const std::size_t N = 5;
int ar[N];
std::generate_n(ar, N, std::rand);
// Using the C function rand()
std::cout << "ar: ";
std::copy(ar, ar+N, std::ostream_iterator<int>(std::cout, " "));
cout << endl;
} 

std::generate和std::generate_n相关推荐

  1. C++多线程:异步操作std::async和std::promise

    文章目录 std::async 简介 使用案例 std::promise 简介 成员函数 总结 之前的文章中提到了C++多线程中的异步操作机制 C++ 多线程:future 异步访问类(线程之间安全便 ...

  2. C++中std::reverse和std::reverse_copy的使用

    std::reverse:反转排序容器内指定范围中的元素. std::reverse_copy与std::reverse唯一的区别是:reverse_copy会将结果拷贝到另外一个容器中,而不影响原容 ...

  3. C++中std::function和std::bind

    1.可调用对象 可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型: 是一个具有operator()成员函数的类的对象: 可被转换成函数指针的类对象: 一个类成员函数指针: ...

  4. c语言stoi函数源码,一系列相关函数的通用函数(例如std::stoi,std::stof,std::stod等)...

    我想为std :: stoi,std :: stof,std :: stod等做一个通用函数..就像: // std::string -> int std::string str = " ...

  5. 【c++】4.std::shared_ptr、std::make_shared、 .get() 、.data()、void *p 的用法、裸指针

    std::shared_ptr.std::make_shared. .get() ..data().void *p 的用法.裸指针 (1)shared_ptr能够记录对象被引用的次数,主要被用来管理动 ...

  6. class std::vectorclass std::basic_stringchar,struct std::char_traitschar,class std::allocatorch

    问题描述 今天用vs编译C++代码时碰到了如下错误: 报错信息: 错误 LNK2005 class std::vector<class std::basic_string<char,str ...

  7. C++11 std::bind 和 std::placeholder

    @time 2019-07-07 @author Ruo_Xiao std::bind 则是用来绑定函数调用的参数的, 它解决的需求是我们有时候可能并不一定能够一次性获得调用某个函数的全部参数,通过这 ...

  8. 使用 std::shared_ptr 和 std::unique_ptr 测试 boost/pointer_cast.hpp

    使用 std::shared_ptr 和 std::unique_ptr 测试 boost/pointer_cast.hpp 实现功能 C++实现代码 实现功能 使用 std::shared_ptr ...

  9. C++演示std :: sort(),std :: reverse()的函数(附完整源码)

    @[TOC](C++演示std :: sort(),std :: reverse()的函数) C++演示std :: sort(),std :: reverse()的函数完整源码(定义,实现,main ...

最新文章

  1. java robot类自动截屏
  2. ⒈Altiris cms 7.0 安装前准备工作
  3. ajax同步和异步的差异
  4. Android GooglePay 填坑录
  5. 20165306 我期望的师生关系
  6. C++--浅谈开发系统的经验
  7. ThreadLocal就是这么简单
  8. MySQL relay log 详细参数解释
  9. struct结构体初始化3种方法
  10. div中文字,图片居中对齐,兼容FF、IE
  11. android的自定义字体,Android 自定义字体方案
  12. 获得学士学位的机器学习工程工作
  13. centos7 搭建安装zabbix3.0邮件告警实例(二)
  14. linux系统管理员用户名为admin,Linux创建系统管理员用户
  15. ATmega16 单片机 AVR单片机 多路温度采集系统
  16. 美团机器学习InAction系列—实例详解机器学习如何解决问题
  17. Android中管理代码基本工作流程
  18. 程序员代码面试指南刷题--第五章.字符串的调整II
  19. Unity 接入百度AI - 动物识别
  20. 基于visual Studio2013解决面试题之1003字符串逆序

热门文章

  1. 手机哪里有记事本 手机记事本在哪里找
  2. java actor_Java并发之actor模型
  3. 说一个奇奇怪怪的知识点,uniapp,公众号页面,uni.chooseImage只能相机或者相册选,不能同时使用两种方式sourceType:['camera','album']...
  4. 假艾斯机器人_奥特曼格斗进化3艾斯机器人技能解析攻略 艾斯机器人玩法
  5. MPLS协议原理与配置详解
  6. 理光gr2 android,RICOH 理光 GR2 银色版 上手体验+样张
  7. 正则表达式->字符串根据英文与数字分隔(切割成数组)
  8. 【考试】2023年5月软件设计师考试感受
  9. 服务器虚拟化ha,Citrix 服务器虚拟化之十 Xenserver高可用性HA
  10. jquery滑入滑出