博客
关于我
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/

    你可能感兴趣的文章
    Position属性四个值:static、fixed、absolute和relative的区别和用法
    查看>>
    POSIX thread编程中关于临界区内条件变量的分析
    查看>>
    POSIX与程序可移植性
    查看>>
    posix多线程有感--自旋锁
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>
    POSIX标准和XSI扩展
    查看>>
    post install error,please remove node_moules before retry
    查看>>
    postcss-pxtorem 参数之selectorBlackList、exclude的用法
    查看>>
    Postek博思得标签打印机更换电脑,打印出来标签空白
    查看>>
    postfix+ dovecot搭建邮件服务器
    查看>>
    postfix在邮件服务器中的使用
    查看>>
    PostGIS 3.1.2软件安装详细教程(地图工具篇.8)
    查看>>
    PostGIS中获取所有EPSG的编码以及对应Proj4字符串
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>
    PostGIS在Windows上的下载与安装
    查看>>
    Qt开发——网络编程之UDP客户端
    查看>>
    postgis数据库优化_postgresql 性能优化
    查看>>
    postgis求面积、交集等相关函数
    查看>>
    postgis相关函数
    查看>>
    Postgres Docker版本安装mysql_fdw 插件
    查看>>