博客
关于我
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 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 基础模块的面试题总结
    查看>>
    MySQL 备份 Xtrabackup
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>