目标合并【C++】容器元素的复制和变换

之前一直在研究目标合并之类的问题,下午正好有机会和大家分享一下.

    一、复制容器元素:copy()算法

    copy()的原形如下:

template<class InputIterator, class OutputIterator>
		OutputIterator copy(
		InputIterator _First, //源容器起始位置
		InputIterator _Last, //源容器终止位置
		OutputIterator _DestBeg //目标容器的起始位置
		);

    列子:将两张成就表统计到一起,构成一张成就总表。

vector<int> vecScore1;
	vector<int> vecScore2;
	//对容器进行操纵,保存成就
	...
	//保存总成就的容器
	vector<int> vecScore;
	//根据各个容器的大小,重新设定总容器的容量
	vecScore.resize(vecScore1.size() + vecScore2.size());
	//复制第一张成就单 itLast将指向所有复制进来的数据的末尾位置
	vector<int>::iterator itLast = copy(vecScore1.begin(), vecScore1.end(), vecScore.begin());
	//复制第二张
	copy(vecScore2.begin(), vecScore2.end(), itLast);

    

    二、逆向复制容器元素:copy_backward()

    copy()函数可以将某个容器中的数据正向的复制给另外一个容器,但有时候我们须要复制从后向前放置到目标容器中,这时候可以应用copy_backward()

    原形:

template<class BidirectionalIterator1, class BidirectionalIterator2>
   BidirectionalIterator2 copy_backward(
      BidirectionalIterator1 _First, 
      BidirectionalIterator1 _Last,
      BidirectionalIterator2 _DestEnd //指向目标容器某个位置的迭代器,即从这个位置逐一向前放置到目标容器中
   );

    例如: 高校扩招2倍

vector<Student> vecStudent;
	//对容器进行操纵,保存成就
	...
	//扩展两倍容器
	vecStudent.resize(vecStudent.size() * 2);
	copy_backward(vecStudent.begin(), vecStudent.begin() + vecStudent.size() / 2, vecStudent.end());

    三、合并容器元素 merge()

    用以将两个源容器中的数据合并到目标容器的算法。

    原型:

template<class InputIterator1, class InputIterator2, class OutputIterator>
   OutputIterator merge(
      InputIterator1 _First1, 
      InputIterator1 _Last1,
      InputIterator2 _First2, 
      InputIterator2 _Last2, 
      OutputIterator _Result
   );

    注意

    :应用merge()算法之前必须先应用sort()算法对两个源容器中的数据进行排序

vector<int> vecScore1;
	vector<int> vecScore2;
	vector<int> vecScore;
	//操纵数据
	...
	sort(vecScore1.begin(), vecScore1.end());
	sort(vecScore2.begin(), vecScore2.end());
	// 调整目标容器的大小
	vecScore.resize(vecScore1.size() + vecScore2.size());
	//合并到目标目标容器
	merge(vecScore1.begin(), vecScore1.end(),
			 vecScore2.begin(), vecScore2.end(),
			 vecScore.begin());
}

    四、合并并去除冗余元素容器 set_union()

    应用merge() 合并容器时,如果两个合并的容器中有雷同的元素,则在合并后的容器中会出想两份雷同的数据,有时候这个是不须要的。

    每日一道理
青春是用意志的血滴和拼搏的汗水酿成的琼浆——历久弥香;青春是用不凋的希望和不灭的向往编织的彩虹——绚丽辉煌;青春是用永恒的执著和顽强的韧劲筑起的一道铜墙铁壁——固若金汤。
// 总清单
	vector<string> vecGoods;
	// 文具清单
	vector<string> vecStationaries;
	vecStationaries.push_back("Pen");
	vecStationaries.push_back("Notes");
	// 办公用品清单
	vector<string> vecOfficeSupplies;
	vecOfficeSupplies.push_back("Pen");
	vecOfficeSupplies.push_back("Files");

	//调整容器大小
	vecGoods.resize(vecOfficeSupplies.size() + vecStationaries.size());
	//对源容器进行排序
	sort(vecStationaries.begin(), vecStationaries.end());
	sort(vecOfficeSupplies.begin(), vecOfficeSupplies.end());

	// 应用set_union() 合并到目标容器
	// set_union() 返回指向合并后的目标容器中最后一个数据的迭代器
	vector<string>::iterator itEnd = 
		set_union(vecStationaries.begin(), vecStationaries.end(),
		              vecOfficeSupplies.begin(), vecOfficeSupplies.end(),
		               vecGoods.begin());
	//输出合并后的商品
	for (vector<string>::iterator it  = vecGoods.begin(); it != itEnd; ++it)
	{
		cout<<*it<<endl;
	}

    另外:STL还提供了set_difference()用于计算两个容器的差集,set_intersection()用于计算两个容器的交集

    五、变换容器元素 transform()

    在复制元素时,有时候须要对元素进行某些操纵。例如,希望将某个容器的数据 变为原来的两倍。

    copy()能够移动数据,但是无法在移动过程中对数据进行操纵。transform()就是干这个事情的

    原型:

template<class InputIterator, class OutputIterator, class UnaryFunction>
   OutputIterator transform(
      InputIterator _First1, 
      InputIterator _Last1, 
      OutputIterator _Result,
      UnaryFunction _Func //算法的操纵函数
   );
template<class InputIterator1, class InputIterator2, class OutputIterator,
   class BinaryFunction>
   OutputIterator transform(
      InputIterator1 _First1, 
      InputIterator1 _Last1,
      InputIterator2 _First2, //第二个参数起始位置
      OutputIterator _Result,
      BinaryFunction _Func
   );

    例子:大学考试后,老师调整55分以上,60分以下的为60分

/ 定义移动数据过程中的操纵函数
int Increase(int nScore)
{
	if (nScore > 55 && nScore < 60)
	{
		nScore = 60;
	}
	return nScore;
}

vector<int> vecScore;

vecScore.push_back(26);
vecScore.push_back(56);
vecScore.push_back(72);
//对容器中数据进行处理
transform(vecScore.begin(), vecScore.end(),  //输出数据的范围
		  vecScore.begin() ,                      ///保存处理结果的容器的起始位置
		  Increase);

    

    

    

    

文章结束给大家分享下程序员的一些笑话语录: 某程序员对书法十分感兴趣,退休后决定在这方面有所建树。花重金购买了上等的文房四宝。一日突生雅兴,一番磨墨拟纸,并点上了上好的檀香,颇有王羲之风 范,又具颜真卿气势,定神片刻,泼墨挥毫,郑重地写下一行字:hello world.

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3086103.html