【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()函数可以将某个容器中的数据正向的复制给另外一个容器,但有时候我们需要复制从后向前放置到目标容器中,这时候可以使用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);
- 【C++】容器元素的复制和变换
- 【C++】容器元素的复制和变换
- C++ - 复制容器(container)的元素至另一个容器
- transform 容器元素变换函数
- 【C/C++】顺序容器访问元素和删除元素
- c++STL容器vector的复制
- STL 容器里的元素,必须“可复制”
- vector和list容器之间的复制
- c语言 坐标系的转化 数组元素顺序的变换
- python -- 元素和容器
- 【C++】循环删除vector等容器内的元素
- 变换后矩阵右上三角元素和与左下三角元素和可能的最大差值
- python-各类容器的复制和排序问题
- YTU:C语言习题 矩阵元素变换
- C语言习题 矩阵元素变换
- STL:循环删除容器中元素的方法和陷阱
- STL:循环删除容器中元素的方法和陷阱
- STL:循环删除容器中元素的方法和陷阱
- MySQL的优化
- Eclipse开发Android程序如何在手机上运行
- android 带有图标的ListView 并带有长按菜单
- socket编程
- Spring JdbcTemplate使用
- 【C++】容器元素的复制和变换
- C++文件读写详解(ofstream,ifstream,fstream)
- 黑马程序员_DOS命令行的使用和java环境搭配
- 数据库优化方案
- ShareSDK
- 图像拉普拉斯金字塔融合(Laplacian Pyramid Blending)
- centos zabbix sendmail 终于搞定啦!
- 性能测试分享---java vuser协议(2)---LoadRunner篇
- 带外数据详解