* 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)
* 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類型的數組: