C++STLアルゴリズムシリーズ6---copy関数

10341 ワード


今、変易アルゴリズムを見てみましょう.変易アルゴリズム(Mutating algorithms)とは,コンテナ要素データを修正できるテンプレート関数のセットであり,シーケンスデータのコピー,変換などが可能である.
最初の変数アルゴリズム:要素コピーアルゴリズムcopyを見てみましょう.このアルゴリズムは主にコンテナ間の要素のコピーに使用され、反復器区間[first,last)の要素をコピー先resultによって与えられた区間[result,result+(last-first))にコピーします.関数のプロトタイプを見てみましょう.
1     template<class InputIterator, class OutputIterator>  
2        OutputIterator copy(  
3           InputIterator _First,   
4           InputIterator _Last,   
5           OutputIterator _DestBeg  
6        );  

パラメータ
_First, _Last
コピーする要素の区間範囲[_First,_Last].
_DestBeg 
コピーされたターゲット区間の開始位置を指定します.
戻り値
複製された要素区間の最後の位置を示す反復器を返します.
プログラムの例:
まず、単純な例を示し、単純な整形配列myintsを定義し、そのすべての要素をコンテナmyvectorにコピーし、配列を左に1つ移動します.
 1 #include <iostream>  
 2 #include <algorithm>  
 3 #include <vector>  
 4   
 5 using namespace std;  
 6   
 7 int main ()   
 8 {  
 9     int myints[] = {10, 20, 30, 40, 50, 60, 70};  
10     vector<int> myvector;  
11     vector<int>::iterator it;  
12       
13     myvector.resize(7);   //    myvector      
14       
15     //copy   :  
16     //   myints         myvector     
17     copy ( myints, myints+7, myvector.begin() );  
18       
19     cout << "myvector contains: ";  
20     for ( it = myvector.begin();  it != myvector.end();  ++it )  
21     {  
22         cout << " " << *it;  
23     }  
24     cout << endl;  
25   
26     //copy   :  
27     //   myints            
28     copy(myints + 1, myints + 7, myints);  
29   
30     cout << "myints contains: ";  
31     for ( size_t i = 0; i < 7; ++i )  
32     {  
33         cout << " " << myints[i];  
34     }  
35     cout << endl;  
36   
37     return 0;  
38 }  

前例からcopyアルゴリズムは一つの容器の中の要素を簡単に別の目標容器にコピーすることができ、前例のコードは特にmyvectorに注意しなければならない.resize(7);この行のコードは、ここで必ずvectorに空間を割り当てなければなりません.そうしないと、プログラムが崩れてしまいます.これは初心者がよく犯す間違いです.実はcopy関数の最大の威力は標準入出力反復器と組み合わせたときであり,以下の例からその威力を見ることができる.
 1 #include <iostream>  
 2 #include <algorithm>  
 3 #include <vector>  
 4 #include <iterator>  
 5 #include <string>  
 6   
 7 using namespace std;  
 8   
 9 int main ()   
10 {  
11      typedef vector<int> IntVector;  
12      typedef istream_iterator<int> IstreamItr;  
13      typedef ostream_iterator<int> OstreamItr;  
14      typedef back_insert_iterator< IntVector > BackInsItr;  
15    
16      IntVector myvector;  
17   
18      //              
19      //
20      cout << "Please input element:" << endl;  
21      copy(IstreamItr(cin), IstreamItr(), BackInsItr(myvector));  
22   
23      //
24      cout << "Output : " << endl;  
25      copy(myvector.begin(), myvector.end(), OstreamItr(cout, " "));   
26      cout << endl;  
27   
28     return 0;  
29 }  

ソース:http://blog.csdn.net/jerryjbiao/article/details/7376088