直接改变元素值,或者在复制到另一区间的过程中改变元素值

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 <iostream>
#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++算法】变动性算法相关推荐

  1. 非变动性算法源代码分析与使用示例( 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 ...

  2. 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)

    首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...

  3. 算法总结---最常用的五大算法(算法题思路)

    算法总结---最常用的五大算法(算法题思路) 一.总结 一句话总结: [明确所求:dijkstra是求点到点的距离,辅助数组就是源点到目标点的数组] [最简实例分析:比如思考dijkstra:假设先只 ...

  4. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  5. 期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用

    期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用 EM的应用 EM算法有很多的应用,最广泛的就是GMM混合高斯模型.聚类.HMM等等.具体可以参考Jerry ...

  6. 数据结构与算法:算法简介

    数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...

  7. 社团发现算法-BGLL算法(附代码实现)

    一.社团发现算法 人们发现许多实际网络均具有社团结构, 即整个网络由若干个社团组成,社团之间的连接相对稀疏.社团内部的连接相对稠密.社团发现则是利用图拓扑结构中所蕴藏的信息从复杂网络 中解析出其模块化 ...

  8. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  9. 【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )

    文章目录 总结 一.标记-清除算法 二.复制算法 三.标记-整理算法 总结 常用的垃圾回收算法 : 标记-清除算法 ; 复制算法 ; 标记-整理算法 ; 这些算法没有好坏优劣之分 , 都有各自的 优势 ...

最新文章

  1. linux mysql 5.7.12_Linux环境mysql5.7.12安装教程
  2. JAVA Calendar方法详解
  3. linux 初始化工作环境
  4. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
  5. 提高代码性能及并发性的方法浅谈
  6. 机器学习Sklearn实战——其他线性回归模型、逻辑回归
  7. c51为啥要宏定义时钟_51单片机时钟实训报告
  8. Bootstrap3 折叠插件的选项
  9. TIOBE 12 月编程语言排行榜:争夺年度编程语言,Java、C、Python、C# 即将开战!...
  10. Spring MVC-表单(Form)标签-单选按钮(RadioButton)示例(转载实践)
  11. 大卫科波菲尔优秀读后感范文4000字
  12. 等价类划分法写测试用例练习
  13. Discuz仿今日头条模板/Discuz新闻资讯商业版GBK模板
  14. [SV]SystemVerilog Structured Procedures --- always_comb、always_ff、always_latch
  15. Python格式化JSON文件
  16. MySql自定义函数的定义和使用
  17. mysql 毫秒转换为天时分秒
  18. dllcache的详细说明
  19. 前端布局实战:三国杀页面布局(下)
  20. 湖大校园网可以使用,但是进不去校内网站

热门文章

  1. SQL Server 2014安装教程
  2. 如何将静态网页通过nginx访问
  3. 新手小白零基础搭建个人博客(二)Hexo搭建
  4. 用vmware安装win7虚拟机(windows10系统)
  5. 让数组的左边全为奇数C语言,2015年全国计算机等级考试全真模拟考场_二级C语言试卷四.docx...
  6. mysql 线性表_数据结构-线性表之顺序表
  7. ST_Curve --- 一个专业的曲线绘制控件
  8. GetClientRect()和GetWindowRect()
  9. wsl使用可视化界面_通过 VcXsrv 在 WSL2 上使用图形化界面(xfce4)
  10. DNS无法解析IP_计算机网络-DNS