前文中展示了copy的魅力,现在我们来看一下它的孪生兄弟copy_backward,copy_backward算法与copy在行为方面相似,只不过它的复制过程与copy背道而驰,其复制过程是从最后的元素开始复制,直到首元素复制出来。也就是说,复制操作是从last-1开始,直到first结束。这些元素也被从后向前复制到目标容器中,从result-1开始,一直复制last-first个元素。举个简单的例子:已知vector {0, 1, 2, 3, 4, 5},现我们需要把最后三个元素(3, 4, 5)复制到前面三个(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        : jbiaojerry@gmail.com
 * 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        : jbiaojerry@gmail.com
 * 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 ? " " : "\n\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:\n\t";
	for_each( svec.begin(), svec.end(), output_element() );
	cout << "\n" << 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()): \n\t";
	for_each( svec.begin(), svec.end(), output_element() );
	cout << "\n" << endl;

	return 0;
}

 

*******************************************************************************************************************************

C++经典书目索引及资源下载:http://blog.csdn.net/jerryjbiao/article/details/7358796

********************************************************************************************************************************

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐