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


前文ではcopyの魅力を示していますが、双子の兄弟copyを見てみましょう.backward,copy_backwardアルゴリズムはcopyと動作が似ているが、そのレプリケーションプロセスはcopyとは逆であり、そのレプリケーションプロセスは最後の要素から最初の要素がレプリケーションされるまでレプリケーションされる.すなわち、コピー操作はlast−1からfirstが終了するまで開始される.これらの要素もターゲットコンテナに後方から前方にコピーされ、result-1からlast-first個の要素がコピーされます.簡単な例を挙げるとvector{0,1,2,3,4,5}が知られています.最後の3つの要素(3,4,5)を前の3つの(0,1,2)の位置にコピーする必要があります.first設定値3の位置をlastを5の次の位置に設定し、resultを3の位置に設定すると、値5を2の位置にコピーすることができます.次に4を1の位置にコピーし,最後の3を0の位置にコピーし,我々が望むシーケンス{3,4,5,3,4,5}を得た.次にcopyを見てみましょうbackwardの関数プロトタイプ:
関数のプロトタイプ:
 template<class BidirectionalIterator1, class BidirectionalIterator2>
  BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
                                         BidirectionalIterator1 last,
                                         BidirectionalIterator2 result); 

パラメータ:
first,lastはコピーされた要素の区間範囲を示す[first,last).resultはターゲット区間にコピーされた具体的な位置を示す[result-(last-first),result)
戻り値:
複製された要素区間の開始位置を示す反復器を返します.
プログラムの例:
まず簡単な例でcopy_を説明します.backwardの使い方は、プログラムが簡単で、コードに詳しく説明されていますが、ここでは邪魔になりません.
/*******************************************************************
 * Copyright (C) Jerry Jiang
 *               
 * File Name   : copy_backward.cpp
 * Author      : Jerry Jiang
 * Create Time : 2012-3-21 23:14:57
 * Mail        : [email protected]
 * Blog        : http://blog.csdn.net/jerryjbiao 
 *               
 * Description :         C++ STL                         
 *                     :     copy_backward 
 *               
 ******************************************************************/

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

using namespace std;

int main()
{
	vector<int> myvector;
	vector<int>::iterator iter;

	//   myvector    :10 20 30 40 50
	for ( int i = 1; i <= 5; ++i )
	{
		myvector.push_back( i*10 );
	}

	// myvector       3   
	myvector.resize( myvector.size()+3 );

	//     20、10     、      :10 20 30 40 50 0 10 20
	//  copy_backward     ,  20        ,  10        
	copy_backward( myvector.begin(), myvector.begin()+2, myvector.end() );

	for ( iter = myvector.begin(); iter != myvector.end(); ++iter )
	{
		cout << " " << *iter;
	}

	cout << endl;


	//  myvector  
	myvector.clear();

	//    myvector    :10 20 30 40 50
	for ( i = 1; i <= 5; ++i )
	{
		myvector.push_back( i*10 );
	}

	//     40、50  10、20,  :40 50 30 40 50:
	copy_backward( myvector.end()-2, myvector.end(), myvector.end()-3 );
	
	for ( iter = myvector.begin(); iter != myvector.end(); ++iter )
	{
		cout << " " << *iter;
	}
	
	cout << endl;
	return 0;
}

前例の簡単な紹介でcopy_backwardの基本的な使い方はもう見慣れないでしょう^^、次に、前述のfor_searchアルゴリズムでcopyを強化しますbackwardの使用.
/*******************************************************************
 * Copyright (C) Jerry Jiang
 *               
 * File Name   : copy_backward02.cpp
 * Author      : Jerry Jiang
 * Create Time : 2012-3-21 23:48:14
 * Mail        : [email protected]
 * Blog        : http://blog.csdn.net/jerryjbiao 
 *               
 * Description :         C++ STL                         
 *                     :     copy_backward 
 *               
 ******************************************************************/

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

using namespace std;

class output_element
{
public:
	//     ()
	void operator() (string element)
	{
		cout << element
			 << ( _line_cnt++ % 7 ? " " : "
\t"); // , 7 } static void reset_line_cnt() { _line_cnt = 1; } private: static int _line_cnt; }; int output_element::_line_cnt = 1; // int main() { string sa[] = { "The", "light", "untonusred", "hair", "grained", "and", "hued", "like", "pale", "oak" }; vector<string> svec(sa, sa+10); // for_each , , //for_each http://blog.csdn.net/jerryjbiao/article/details/6827508 cout << "Original list of strings:
\t"; for_each( svec.begin(), svec.end(), output_element() ); cout << "
" << endl; // "The", "light", "untonusred", "hair","grained", //"and", "hued" "like", "pale", "oak" copy_backward(svec.begin(), svec.end()-3, svec.end()); output_element::reset_line_cnt(); cout << "sequence after " << "copy_backward(svec.begin(), svec.end()-3, svec.end()):
\t"; for_each( svec.begin(), svec.end(), output_element() ); cout << "
" << endl; return 0; }

 
*******************************************************************************************************************************
C++経典書目索引及び資源ダウンロード:http://blog.csdn.net/jerryjbiao/article/details/7358796
********************************************************************************************************************************