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

本文共 1946 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    npm ERR! Unexpected end of JSON input while parsing near '...on":"0.10.3","direc to'
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
    查看>>
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 卡着不动的解决方法
    查看>>
    npm install 报错 EEXIST File exists 的解决方法
    查看>>
    npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
    查看>>
    npm install 报错 Failed to connect to github.com port 443 的解决方法
    查看>>
    npm install 报错 fatal: unable to connect to github.com 的解决方法
    查看>>
    npm install 报错 no such file or directory 的解决方法
    查看>>
    npm install 权限问题
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm install无法生成node_modules的解决方法
    查看>>
    npm install的--save和--save-dev使用说明
    查看>>
    npm node pm2相关问题
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm run build报Cannot find module错误的解决方法
    查看>>
    npm run build部署到云服务器中的Nginx(图文配置)
    查看>>