【C++】容器元素的复制和变换

来源:互联网 发布:爱思唯尔数据库主页 编辑:程序博客网 时间:2024/05/20 18:48

一、复制容器元素: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);








原创粉丝点击