一、复制容器元素: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 //指向目标容器某个位置的迭代器,即从这个位置逐个向前放置到目标容器中
);
例如: 高校扩招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);