【c++算法】变动性算法
直接改变元素值,或者在复制到另一区间的过程中改变元素值
For_each |
针对每个元素执行某项操作 |
Copy |
从第一个元素开始复制某段区间 |
Copy_backward |
从最后一个元素开始复制某段区间 |
Transform |
变动(并复制)元素,将两个区间元素合并 |
Merge |
合并两个区间 |
Swap_ranges |
交换区间内的元素 |
Fill |
以给定值替换每个元素 |
Finn_n |
以给定值替换n个元素 |
Generate |
以某项操作的结果替换每个元素 |
Generate_n |
以某项操作的结果替换n个元素 |
Replace |
将具有某特定值的元素替换为另一个值 |
Replace_if |
将符合条件的元素替换为另一个值 |
Replace_copy |
复制整个区间,同时将具有某特定值的元素替换为另一个值 |
Replace_copy_if |
复制整个区间,同时将符合条件的元素替换为另一个值 |
#include <vector>
#include <algorithm>
#include <iterator>
#include <list>
using namespace std;
template<class T>
class FunctionObjectType
{
private:
T theValue;
public:
FunctionObjectType(const T& v):theValue(v)
{
}
public:
void operator()(T &i)
{
i += theValue;
}
};
/*--------------打印元素-------------*/
template<class T>
inline void PrintElements(const T& coll,const char* optcstr="")
{
typename T::const_iterator pos;
std::cout<<optcstr;
for(pos=coll.begin();pos != coll.end(); ++pos)
std::cout<<*pos<<" ";
std::cout<<std::endl;
}
template<class T>
inline void PrintElementsPos(const T& coll,const char* optcstr="")
{
typename T::const_iterator pos;
std::cout<<optcstr;
for(pos=coll.begin();pos != coll.end(); ++pos)
std::cout<<&*pos<<" ";
std::cout<<std::endl;
}
/*--------------插入int型数据------------------*/
template<class T>
inline void InsertElements(T& coll,int first,int last)
{
for(int i = first; i<=last; ++i)
coll.insert(coll.end(),i);
}
void print(int elem)
{
std::cout<< elem << " ";
}
//for_each对每个元素执行操作
void Learn_for_each2()
{
std::cout<<std::endl<<"--------------------in Learn for_each2()"<<endl;
vector<int> coll;
InsertElements(coll,1,9);
PrintElements(coll,"coll : ");
std::cout<<"每个元素与第一个元素求和"<<endl;
for_each(coll.begin(),coll.end(),
FunctionObjectType<int>(*coll.begin()));
PrintElements(coll,"coll : ");
std::cout<<endl;
}
void Learn_copy()
{
std::cout<<std::endl<<"--------------------in Learn copy() copy_backward()"<<endl;
vector<int> coll1;
list<int> coll2;
InsertElements(coll1,1,9);
PrintElements(coll1,"coll1 : ");
std::cout<<"使用back_inserter把coll1拷贝到coll2"<<std::endl;
copy(coll1.begin(),coll1.end(),back_inserter(coll2));
PrintElements(coll2,"coll2 : ");
coll2.clear();
std::cout<<"使用front_inserter把coll1拷贝到coll2"<<std::endl;
copy(coll1.begin(),coll1.end(),front_inserter(coll2));
PrintElements(coll2,"coll2 : ");
coll2.clear();
std::cout<<"使用inserter把coll1拷贝到coll2,从第开始处插入"<<std::endl;
copy(coll1.begin(),coll1.end(),inserter(coll2,coll2.begin()));
PrintElements(coll2,"coll2 : ");
//coll2.clear();
std::cout<<"把coll1拷贝到coll2,从第二个元素开始覆盖"<<std::endl;
copy(coll1.begin(),coll1.end(),++coll2.begin());
PrintElements(coll2,"coll2 : ");
//coll2.clear();
std::cout<<"使用ostream_iterator,cout"<<std::endl;
copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
std::cout<<std::endl;
coll2.clear();
vector<char> source(10,'.');
for(int c='a';c<='f';c++)
{
source.push_back(c);
}
source.insert(source.end(),10,'.');
PrintElements(source,"source : ");
std::cout<<"从位置7开始copy"<<std::endl;
vector<char> c1(source.begin(),source.end());
copy(c1.begin()+10,c1.begin()+16,c1.begin()+7);
PrintElements(c1,"coll3 : ");
std::cout<<"从位置7开始backward copy"<<std::endl;
vector<char> c2(source.begin(),source.end());
copy_backward(c2.begin()+10,c2.begin()+16,c2.begin()+7);
PrintElements(c2,"coll3 : ");
}
void Learn_transforming()
{
std::cout<<std::endl<<"--------------------in Learn transforming()"<<endl;
std::cout<<"复制修改元素一气完成"<<endl;
vector<int> coll1;
list<int> coll2;
InsertElements(coll1,1,9);
PrintElements(coll1,"coll1 : ");
std::cout<<"求反 : "<<std::endl;
transform(coll1.begin(),coll1.end(),coll1.begin(),negate<int>());
PrintElements(coll1,"coll1 negate : ");
std::cout<<"10倍 : "<<std::endl;
transform(coll1.begin(),coll1.end(),
back_inserter(coll2),
bind2nd(multiplies<int>(),10));
PrintElements(coll2,"coll2 bind2nd : ");
std::cout<<"求反 : ";
transform(coll2.begin(),coll2.end(),
ostream_iterator<int>(cout," "),
negate<int>());
}
void Learn_swap_ranges()
{
std::cout<<std::endl<<"--------------------in Learn swap_ranges()"<<endl;
vector<int> coll1;
list<int> coll2;
InsertElements(coll1,1,9);
InsertElements(coll2,20,35);
PrintElements(coll1,"coll1 : ");
PrintElements(coll2,"coll2 : ");
std::cout<<"交换 : "<<std::endl;
list<int>::iterator pos;
pos = swap_ranges(coll1.begin(),coll1.end(),coll2.begin());
PrintElements(coll1,"coll1 : ");
PrintElements(coll2,"coll2 : ");
if(pos != coll2.end())
{
std::cout<<"第一个没有交换的元素是:"<<*pos<<std::endl;
}
std::cout<<"第一个元素"<<*coll2.begin() <<"和最后一个元素"<<*coll2.rbegin()<<"互换:"<<std::endl;
swap_ranges(coll2.begin(),++coll2.begin(),coll2.rbegin());
PrintElements(coll2,"coll2 : ");
}
void Learn_fill()
{
std::cout<<std::endl<<"--------------------in Learn fill() fill_n()"<<endl;
list<string> coll;
std::cout<<"填充10次‘hello’ : "<<std::endl;
fill_n(back_inserter(coll),10,"hello");
PrintElements(coll,"coll : ");
std::cout<<"coll用world填充 : "<<std::endl;
fill(coll.begin(),coll.end(),"world");
PrintElements(coll,"coll : ");
std::cout<<"填充8次‘hello’ : "<<std::endl;
fill_n(coll.begin(),8,"hello");
PrintElements(coll,"coll : ");
}
void Learn_generate()
{
std::cout<<std::endl<<"--------------------in Learn generate() generate_n()"<<endl;
list<int> coll;
std::cout<<"赋值 10次随机值 : "<<std::endl;
generate_n(back_inserter(coll),10,rand);
PrintElements(coll,"coll : ");
std::cout<<"赋随机值 : "<<std::endl;
generate(coll.begin(),coll.end(),rand);
PrintElements(coll,"coll : ");
}
void Learn_replace()
{
std::cout<<std::endl<<"--------------------in Learn replace() replace_if() replace_copy() replace_copy_if()"<<endl;
list<int> coll;
list<int> coll2;
InsertElements(coll,2,7);
InsertElements(coll,5,9);
PrintElements(coll,"coll : ");
std::cout<<"值为6的元素替换为1: "<<std::endl;
replace(coll.begin(),coll.end(),
6,
1);
PrintElements(coll,"coll : ");
std::cout<<"小于5的元素替换为0: "<<std::endl;
replace_if(coll.begin(),coll.end(),
bind2nd(less<int>(),5),
0);
PrintElements(coll,"coll : ");
std::cout<<"拷贝coll到coll2,拷贝过程中把5替换为55: "<<std::endl;
replace_copy(coll.begin(),coll.end(),
back_inserter(coll2),
5,
55);
PrintElements(coll,"coll : ");
PrintElements(coll2,"coll2 : ");
std::cout<<"拷贝coll到coll2,拷贝过程中把小于5的替换为11: "<<std::endl;
replace_copy_if(coll.begin(),coll.end(),
back_inserter(coll2),
bind2nd(less<int>(),5),
11);
PrintElements(coll,"coll : ");
PrintElements(coll2,"coll2 : ");
}
int main()
{
cout<<"hello world"<<endl;
//--------------------变动性算法--------begin
Learn_for_each2();
Learn_copy();
Learn_transforming();
Learn_swap_ranges();
Learn_fill();
Learn_generate();
Learn_replace();
//cin.get();
return 0;
}
转载于:https://www.cnblogs.com/ningth/archive/2012/02/20/2359426.html
【c++算法】变动性算法相关推荐
- 非变动性算法源代码分析与使用示例( for_each、min_element 、find_if、search 等)...
非变动性算法代码分析与示例: 一.for_each C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // TEMPLATE FUNCTION for_each ...
- 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)
首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...
- 算法总结---最常用的五大算法(算法题思路)
算法总结---最常用的五大算法(算法题思路) 一.总结 一句话总结: [明确所求:dijkstra是求点到点的距离,辅助数组就是源点到目标点的数组] [最简实例分析:比如思考dijkstra:假设先只 ...
- 生成树的概念,最小生成树Prim算法 Kruskal算法
求解最小生成树可以用Prim算法 Kruskal算法
- 期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用
期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用 EM的应用 EM算法有很多的应用,最广泛的就是GMM混合高斯模型.聚类.HMM等等.具体可以参考Jerry ...
- 数据结构与算法:算法简介
数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...
- 社团发现算法-BGLL算法(附代码实现)
一.社团发现算法 人们发现许多实际网络均具有社团结构, 即整个网络由若干个社团组成,社团之间的连接相对稀疏.社团内部的连接相对稠密.社团发现则是利用图拓扑结构中所蕴藏的信息从复杂网络 中解析出其模块化 ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- 【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )
文章目录 总结 一.标记-清除算法 二.复制算法 三.标记-整理算法 总结 常用的垃圾回收算法 : 标记-清除算法 ; 复制算法 ; 标记-整理算法 ; 这些算法没有好坏优劣之分 , 都有各自的 优势 ...
最新文章
- linux mysql 5.7.12_Linux环境mysql5.7.12安装教程
- JAVA Calendar方法详解
- linux 初始化工作环境
- 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
- 提高代码性能及并发性的方法浅谈
- 机器学习Sklearn实战——其他线性回归模型、逻辑回归
- c51为啥要宏定义时钟_51单片机时钟实训报告
- Bootstrap3 折叠插件的选项
- TIOBE 12 月编程语言排行榜:争夺年度编程语言,Java、C、Python、C# 即将开战!...
- Spring MVC-表单(Form)标签-单选按钮(RadioButton)示例(转载实践)
- 大卫科波菲尔优秀读后感范文4000字
- 等价类划分法写测试用例练习
- Discuz仿今日头条模板/Discuz新闻资讯商业版GBK模板
- [SV]SystemVerilog Structured Procedures --- always_comb、always_ff、always_latch
- Python格式化JSON文件
- MySql自定义函数的定义和使用
- mysql 毫秒转换为天时分秒
- dllcache的详细说明
- 前端布局实战:三国杀页面布局(下)
- 湖大校园网可以使用,但是进不去校内网站
热门文章
- SQL Server 2014安装教程
- 如何将静态网页通过nginx访问
- 新手小白零基础搭建个人博客(二)Hexo搭建
- 用vmware安装win7虚拟机(windows10系统)
- 让数组的左边全为奇数C语言,2015年全国计算机等级考试全真模拟考场_二级C语言试卷四.docx...
- mysql 线性表_数据结构-线性表之顺序表
- ST_Curve --- 一个专业的曲线绘制控件
- GetClientRect()和GetWindowRect()
- wsl使用可视化界面_通过 VcXsrv 在 WSL2 上使用图形化界面(xfce4)
- DNS无法解析IP_计算机网络-DNS