generate

[機能]

  指定した範囲の要素を,指定した関数によって生成された要素に設定します.なお,引数 gen は引数を取れません.

[形式]
#include <algorithm>

template <class ForwardIterator, class Generator>
    void generate(ForwardIterator first, ForwardIterator last, Generator gen);		

[使用例]

  1. generate と generate_n の使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上に記述された方法とほぼ同等なものであることを示しています.
    #include <stdio.h>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    int set10() { return 10; }
    
    class set20
    {
    	public:
    		int operator() ()
    		{
    			return 20;
    		}
    };
    
    int sum(int &s, int &n) {
    	s += n;
    	n++;
    	return s;
    }
    
    int main()
    {
    					// 初期設定
    	vector<int> v1 {0, 1, 2, 3, 4, 5};
    	printf("v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    
    					// すべての範囲の要素を 10 にする
    	printf("すべての範囲の要素を 10 にする\n");
    	generate(v1.begin(), v1.end(), set10);   // 関数
    //	generate(v1.begin(), v1.end(), []{ return 10; });   // ラムダ式
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    					// 後ろの 3 つの要素を 20 にする
    	printf("後ろの 4 つの要素を 20 にする\n");
    	generate_n(v1.begin()+2, 4, set20());
    //	generate_n(v1.begin()+2, 4, []{ return 20; });
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    					// n 番目の要素に,1 から n までの和
    	printf("n 番目の要素に,1 から n までの和\n");
    	int s = 0, n = 1;
    	generate(v1.begin(), v1.end(), [&s, &n]{ s += n; n++; return s; });
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    
    	return 0;
    }
    			
    (出力)
    v1 :  0  1  2  3  4  5
    すべての範囲の要素を 10 にする
      v1 :  10  10  10  10  10  10
    後ろの 4 つの要素を 20 にする
      v1 :  10  10  20  20  20  20
    n 番目の要素に,1 から n までの和
      v1 :  1  3  6  10  15  21			
[参照]

generate_nreplacetransform

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引