一、复制容器元素: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()函数可以将某个容器中的数据正向的复制给另外一个容器,但有时候我们需要复制从后向前放置到目标容器中,这时候可以使用copy_backward()
原形:
- template<class BidirectionalIterator1, class BidirectionalIterator2>
- BidirectionalIterator2 copy_backward(
- BidirectionalIterator1 _First,
- BidirectionalIterator1 _Last,
- BidirectionalIterator2 _DestEnd //指向目标容器某个位置的迭代器,即从这个位置逐个向前放置到目标容器中
- );
- 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
- );
- 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());
使用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;
- }
五、变换容器元素 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);