日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

std::generate和std::generate_n

發布時間:2024/1/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 std::generate和std::generate_n 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

* 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。