[セットトップ]簡単なプログラム解釈C++STLアルゴリズムシリーズの13:copy


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

パラメータ
_First, _Last
コピーする要素の区間範囲[_First,_Last].
_DestBeg 
コピーされたターゲット区間の開始位置を指定します.
戻り値
複製された要素区間の最後の位置を示す反復器を返します.
プログラムの例:
まず、単純な例を示し、単純な整形配列myintsを定義し、そのすべての要素をコンテナmyvectorにコピーし、配列を左に1つ移動します.
/*******************************************************************
 * Copyright (C) Jerry Jiang
 *               
 * File Name   : copy01.cpp
 * Author      : Jerry Jiang
 * Create Time : 2012-3-20 22:44:28
 * Mail        : [email protected]
 * Blog        : http://blog.csdn.net/jerryjbiao 
 *               
 * Description :         C++ STL                        
 *                     :     copy  
 *               
 ******************************************************************/

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main () 
{
	int myints[] = {10, 20, 30, 40, 50, 60, 70};
	vector<int> myvector;
	vector<int>::iterator it;
	
	myvector.resize(7);   //    myvector    
	
	//copy   :
	//   myints         myvector   
	copy ( myints, myints+7, myvector.begin() );
	
	cout << "myvector contains: ";
	for ( it = myvector.begin();  it != myvector.end();  ++it )
	{
		cout << " " << *it;
	}
	cout << endl;

	//copy   :
	//   myints          
	copy(myints + 1, myints + 7, myints);

	cout << "myints contains: ";
	for ( size_t i = 0; i < 7; ++i )
	{
		cout << " " << myints[i];
	}
	cout << endl;

	return 0;
}

前例からcopyアルゴリズムは一つの容器の中の要素を簡単に別の目標容器にコピーすることができ、前例のコードは特にmyvectorに注意しなければならない.resize(7);この行のコードは、ここで必ずvectorに空間を割り当てなければなりません.そうしないと、プログラムが崩れてしまいます.これは初心者がよく犯す間違いです.実はcopy関数の最大の威力は標準入出力反復器と組み合わせたときであり,以下の例からその威力を見ることができる.
/*******************************************************************
 * Copyright (C) Jerry Jiang
 *               
 * File Name   : copy2.cpp
 * Author      : Jerry Jiang
 * Create Time : 2012-3-20 23:25:29
 * Mail        : [email protected]
 * Blog        : http://blog.csdn.net/jerryjbiao 
 *               
 * Description :         C++ STL                        
 *                     :     copy  
 *               
 ******************************************************************/

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <string>

using namespace std;

int main () 
{
	 typedef vector<int> IntVector;
	 typedef istream_iterator<int> IstreamItr;
	 typedef ostream_iterator<int> OstreamItr;
	 typedef back_insert_iterator< IntVector > BackInsItr;
 
	 IntVector myvector;

	 //            
	 //                      ,              
	 cout << "Please input element:" << endl;
	 copy(IstreamItr(cin), IstreamItr(), BackInsItr(myvector));

	 //          ,         
	 cout << "Output : " << endl;
	 copy(myvector.begin(), myvector.end(), OstreamItr(cout, " ")); 
	 cout << endl;

	return 0;
}

ほほほ、今copyの不思議な所を知っているでしょう、^^;
 
*******************************************************************************************************************************
C++経典書目索引及び資源ダウンロード:http://blog.csdn.net/jerryjbiao/article/details/7358796
********************************************************************************************************************************