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

    你可能感兴趣的文章
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>
    MySQL与Informix数据库中的同义表创建:深入解析与比较
    查看>>
    mysql与mem_细说 MySQL 之 MEM_ROOT
    查看>>
    MySQL与Oracle的数据迁移注意事项,另附转换工具链接
    查看>>
    mysql丢失更新问题
    查看>>