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)

 

 

 

 

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章