zoukankan      html  css  js  c++  java
  • 目标合并【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.

  • 相关阅读:
    SQL Server游标的使用【转】
    Window.Open参数、返回值
    .NET中class和struct的区别
    MVC中的几个问题汇总
    委托
    Hadoop集群环境搭建
    数学问题
    Ubuntu命令模式基础
    递归与分治-合并排序、快速排序以及循环赛问题
    Mongodb基础
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3086103.html
Copyright © 2011-2022 走看看