• 【C++Primer---C++知识点记录*VI---泛型算法】


    标准库并未给每个容器都定义成员函数来实现这些操作,而是定义了一组泛型算法

    这些算法并不直接操作容器,而是遍历由两个迭代器指定的一个元素范围

    我们发现,它们都可以使用find算法

    算法永远不会执行容器的操作。算法运行于迭代器之上,永远不会直接添加或删除元素

    只读算法

    只读取输入范围内的元素,不改变元素。

    例如find,count,accumulate(在头文件numeric)

    如accumulate的第三个参数,就是开始累加的初值,这个值便决定了函数中使用哪个+运算符以及返回值的类型。我们只能写string(""),而不能写"",因为const char*上并没有定义+运算符

    对于只读而不改变元素的算法,通常最好使用cbegin()和cend(),除非计划使用返回的迭代器去改变元素

    除此之外还有equal,前两个参数是一个容器的首迭代器和尾后迭代器,第三参数是另一个的首迭代器。因此这种只接受一个单一迭代器来表示第二个序列的算法,都假定第二个序列至少和第一个一样长

    写容器元素的算法

    例如,算法fill接受一对迭代器表示一个范围,还接受一个值作为第三个参数,把这个值赋予每个元素。由于算法不会执行容器操作,它不会改变容器大小,因此该算法是安全的

    注意,算法不检查写操作

    vector<int> vec   //空容器

    fill_n(vec.begin(),10,0)  //想把前10个元素置0

    上边的操作会是灾难性的,因为这是一个空容器!

    --------有没有一种保证算法有足够空间来容纳输出数据的方法?----------

    【插入迭代器】

    插入迭代器是一种向容器中添加元素的迭代器。

    值被赋予迭代器指向的元素。

    介绍back_inserter(定义在iterator中)

     我们常常使用back_inserter来创建迭代器,作为算法的目的位置来使用

    拷贝算法

    copy,前两个参数是一组范围,第三个参数是目的序列的起始位置。此算法将输入范围中的元素拷贝到目的序列中

    copy返回目的序列中位置迭代器递增后的值

    replace(a.begin(),a.end(),0,42)——将所有0都换成42

    replace_copy(a.begin(),a.end(),back_inserter(newA),0,42)——原序列不变,newA是原序列的一份拷贝,且所有0都改成了42

    重排容器元素的算法

     

    向算法传递函数

    例:sort有一个重载的版本,可以接收第3个参数,这个参数叫做谓词

    标准库算法有一元谓词(只接受单一参数)、二元谓词(有两个参数)

    接受谓词参数的算法对输入序列中的元素调用谓词

    stable_sort算法:保持相等元素的原有顺序

    lambda表达式

    有时,我们希望进行的操作需要更多参数,超出了算法对谓词的限制:

  • 相关阅读:
    Simulink导出FMU模型文件方法
    数字化时代,企业为什么需要进行数据资产管理?
    HTML+CSS+JS大作业:商城网购网站设计——淘宝1页
    性能测试性能瓶颈问题分析调优案例
    大学生期末网页大作业:基于HTML+CSS+JavaScript蓝色的汽车设备营销企业网站模板13页面
    uniapp android 原生插件开发-测试流程
    Linux线程同步对象:互斥体、信号量、条件变量、读写锁
    Flutter开发之--初识Flutter
    Spring Boot 自动装配
    Vue学习:理解数据代理
  • 原文地址:https://blog.csdn.net/weixin_53459056/article/details/125495114