之前一直在研究目标合并之类的问题,下午正好有机会和大家分享一下.
一、复制容器元素: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.