一、复制容器元素: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);
原形:
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 );
/ 定义移动数据过程中的操作函数 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);