博客
关于我
C++标准库(三):泛型算法、标准库定义的函数对象
阅读量:334 次
发布时间:2019-03-04

本文共 1937 字,大约阅读时间需要 6 分钟。

C++ Primer 读书笔记

《C++ Primer》是一本深入浅出的C++编程指南,涵盖了标准库的核心功能和编程实践。这本书不仅适合初学C++的开发者,还能为已经熟悉C++的程序员提供大量实用的知识。以下是我对书中部分内容的理解和总结。


概述

C++标准库定义了一组泛型算法,这些算法被称为“泛型的”,因为它们可以用于不同类型的元素和多种容器类型。这些算法的核心特性是它们并不直接操作容器,而是通过迭代器来操作元素。这种设计使得算法与数据结构的实现完全分离,提高了代码的可重用性。

算法的输入范围

大多数标准库算法都需要一个输入范围(input range),这个范围由两个迭代器确定,分别指向要处理的第一个元素和尾元素之后的位置。例如,find函数接受一个值,查找它在容器中的位置,而find_if函数则接受一个谓词,来判断元素是否满足特定条件。

算法的灵活性

泛型算法的灵活性在于它们可以处理不同类型的元素和容器。例如,sort函数可以对vectorlist、甚至是数组进行排序。此外,算法还可以通过提供自定义谓词来改变元素的比较方式。


定制操作(提供谓词)

标准库允许我们向泛型算法提供谓词(predicate),这些谓词可以代替默认的比较操作。例如,find函数默认使用元素的==运算符比较,而find_if函数则接受一个自定义的谓词。

谓词的类型

谓词可以是以下几种形式:

  • 一元谓词:只接受单一参数,例如isShorter(const string &s1, const string &s2)
  • 二元谓词:接受两个参数,例如isShorter(const string &s1, const string &s2)
  • 函数、函数指针、λ表达式:可以是预定义的函数、函数指针或自定义的λ表达式。

示例

bool isShorter(const string &s1, const string &s2) {    return s1.size() < s2.size();}sort(words.begin(), words.end(), isShorter);

可以通过λ表达式实现相同功能:

sort(words.begin(), words.end(), [](const string &a, const string &b) {    return a.size() < b.size();});

泛型算法的结构

泛型算法的核心是它们对迭代器的操作要求。根据迭代器的功能,算法分为不同的类别。以下是五种主要的迭代器类别:

  • 输入迭代器:支持基本的比较和解引用操作,适用于单遍扫描。
  • 输出迭代器:支持解引用和递增操作,用于写入数据。
  • 前向迭代器:支持输入和输出迭代器的操作,可以多次读写元素。
  • 双向迭代器:支持前向和反向操作,适用于排序和重排。
  • 随机访问迭代器:支持快速访问和比较操作,适用于排序和查找。

  • 特定容器的算法

    与其他容器不同,listforward_list定义了一些独有的成员函数形式的算法,如sortmergeremove等。这些算法通常比通用版本高效,因为它们直接操作链表的节点,而不是元素。

    链表的特殊操作

    • remove:删除指定元素。
    • unique:删除相邻重复元素。
    • mergesplice:合并两个链表或拆分链表节点。

    这些操作会修改容器的内容,因此需要谨慎使用。


    查找算法

    查找算法是处理容器中的元素位置的重要工具。常见的查找算法包括findfind_ifadjacent_find等。

    示例

    int val = 42;auto result = find(vec.begin(), vec.end(), val);// 如果未找到,result指向尾迭代器

    可以通过谓词实现更复杂的查找逻辑:

    auto wc = find_if(words.begin(), words.end(), [sz](const string &a) {    return a.size() >= sz;});

    其他算法

    除了查找和排序,标准库还提供了许多其他功能,例如:

  • 遍历和修改for_eachtransformreplace等函数。
  • 复制和移动copymoveswap_ranges等函数。
  • 随机化random_shuffleshuffle等函数。
  • 这些算法提供了强大的工具来处理容器的数据。


    总结

    《C++ Primer》是一本极为实用的书籍,它不仅帮助我们理解C++的基础知识,还教会我们如何高效地利用标准库功能。通过学习这些泛型算法,我们能够写出更高效、更可靠的代码,从而在C++编程中游刃有余。

    转载地址:http://jlih.baihongyu.com/

    你可能感兴趣的文章
    Plotly:如何从单条迹线制作堆积条形图?
    查看>>
    Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?
    查看>>
    Plotly:如何使用 Plotly Express 组合散点图和线图?
    查看>>
    Plotly:如何使用 plotly.graph_objects 和 plotly.express 定义图形中的颜色?
    查看>>
    Plotly:如何使用 Python 对绘图对象条形图进行颜色编码?
    查看>>
    Plotly:如何使用 updatemenus 更新一个特定的跟踪?
    查看>>
    Plotly:如何使用长格式或宽格式的 pandas 数据框制作线图?
    查看>>
    Plotly:如何向烛台图添加交易量
    查看>>
    Plotly:如何在 plotly express 中找到趋势线的系数?
    查看>>
    Plotly:如何在桑基图中设置节点位置?
    查看>>
    pm2 start命令中的json格式详解
    查看>>
    pm2启动报错
    查看>>
    pm2通过配置文件部署nodejs代码到服务器
    查看>>
    PML调用PDMS内核命令研究
    查看>>
    PMM安装-第一篇
    查看>>
    PMP知识要点(第九章)
    查看>>
    PNETLab 镜像包官方下载太慢?不急,最新版本PNET_4.2.10分享!
    查看>>
    POCO库中文编程参考指南(4)Poco::Net::IPAddress
    查看>>
    Quartz基本使用(二)
    查看>>
    POC项目安装与使用指南
    查看>>