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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Google面经,已拿到offer哦!
- 下一篇: 编写病人医院看病模拟程序