copy

[機能]

  指定した範囲をコピーします.

[形式]
#include <algorithm>

template <class InputIterator, class OutputIterator>
    OutputIterator copy(InputIterator first, InputIterator last,
                        OutputIterator result);		

[使用例]

  1. copy,copy_n,copy_if,copy_backward の使用方法です.コピーの際,挿入イテレータを使用しない限り,自動的に領域は拡張されませんので注意してください.以下に示すプログラム例において,いくつかのコメント部分は,その上に記述された方法とほぼ同等なものであることを示しています.
    #include <stdio.h>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    bool is_Odd(int x)
    {
    	return x % 2 != 0;
    }
    
    int main()
    {
    					// 初期設定
    	vector<int> v1 {0, 1, 2, 3, 4};
    	printf("v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    
    	vector<int> v2 {10, 17, 21};
    	printf("v2 :");
    	for (auto x : v2)
    		printf("  %d", x);
    	printf("\n");
    					// copy
    	printf("**v1 の 2 番目の要素以降に v2 をコピー**\n");
    	copy(v2.begin(), v2.end(), v1.begin()+1);
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    
    	printf("**v1 の最初に v2 の最初の 1 個をコピー**\n");
    	copy_n(v2.begin(), 1, v1.begin());
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    
    	printf("**v1 の最初に v2 内の奇数要素だけをコピー**\n");
    	copy_if(v2.begin(), v2.end(), v1.begin(), is_Odd);   // 関数
    //	copy_if(v2.begin(), v2.end(), v1.begin(), [](int x){ return x%2 > 0; });   // ラムダ式
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    
    	printf("**v1 の 2 番目の前に v2 を挿入コピー**\n");
    	copy(v2.begin(), v2.end(), inserter(v1, v1.begin()+1));   // inserter 参照
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    
    	printf("**v1 を v3 にコピー(挿入コピーでないとだめ)**\n");
    	vector<int> v3;
    	copy(v1.begin(), v1.end(), inserter(v3, v3.begin()));
    	printf("  v3 :");
    	for (auto x : v3)
    		printf("  %d", x);
    	printf("\n");
    					// copy_backward
    	printf("**v2 を v1 の一番後にコピー**\n");
    	copy_backward(v2.begin(), v2.end(), v1.end());
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    
    	return 0;
    }
    			
    (出力)
    v1 :  0  1  2  3  4
    v2 :  10  17  21
    **v1 の 2 番目の要素以降に v2 をコピー**
      v1 :  0  10  17  21  4
    **v1 の最初に v2 の最初の 1 個をコピー**
      v1 :  10  10  17  21  4
    **v1 の最初に v2 内の奇数要素だけをコピー**
      v1 :  17  21  17  21  4
    **v1 の 2 番目の前に v2 を挿入コピー**
      v1 :  17  10  17  21  21  17  21  4
    **v1 を v3 にコピー(挿入コピーでないとだめ)**
      v3 :  17  10  17  21  21  17  21  4
    **v2 を v1 の一番後にコピー**
      v1 :  17  10  17  21  21  10  17  21
    			
[参照]

copy_ncopy_ifcopy_backwardreplace_copyreplace_copy_ifremove_copyremove_copy_ifreverse_copyrotate_copyunique_copypartition_copy

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