ShuangChenYue ShuangChenYue
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
  • Cpp之旅

    • 第1章 基础
    • 第2章 用户自定义类型
    • 第3章 模块化
    • 第4章 错误处理
    • 第5章 类
    • 第6章 基本操作
    • 第7章 模板
    • 第8章 概念和泛型编程
    • 第9章 标准库
      • 9.1 引言
      • 9.2 标准库组件
      • 9.3 标准库的组织
        • 9.3.1 命名空间
        • 9.3.2 ranges命名空间
        • 9.3.3 模块
      • 9.4 建议
  • Cpp专栏

  • Effetcive_CPP

  • muduo网络库

  • Unix环境高级编程

  • Cpp提高编程

  • CPP语言
  • Cpp之旅
霜晨月
2023-11-24
目录

第9章 标准库

# Cpp之旅(学习笔记)第9章 标准库

当无知稍纵即逝时,又何必浪费时间学习呢?

​ ——霍布斯

# 9.1 引言

第9~18章将对重要的标准库工具和方法给出一个概要性的介绍。如:string、ostream、variant、vector、map、path、unique_ptr、thread、regex、system_clock、time_zone和complex。

作者说:不要因为对某些细节理解不够充分而心烦或气馁。本章的目的是让我们对最有用的标准库工具有一个基本的了解。

# 9.2 标准库组件

标准库提供的工具和方法可以分为如下几类:

太多了,只写几个关键的能记住的吧

  • 运行时语言支持库(例如:对资源分配、异常和运行时类型信息的支持)。
  • C标准库。
  • 字符串库。
  • 正则表达式库。
  • I/O流库。
  • 以可移植的方式处理文件系统的文件操作库。
  • 容器框架库(vector、map)和算法库(find()、sort()、merge())。也习惯称为标准模板库(STL)。
  • 。。。。。。
  • 并发程序支持库,包括thread和锁机制。
  • 同步协程库及异步协程库。
  • 并行库,包含部分数学算法及大多数STL算法的并行版本,比如sort()、reduce()。
  • 支持模板元程序设计的工具库(类型特性)、STL风格的泛型程序设计(pair)和通用程序设计(variant和optional)。
  • 用于资源管理的“智能指针”库(unique_ptr和shared_ptr)。
  • 特殊用途容器库(array、bitset、tuple)。
  • 。。。。。。

# 9.3 标准库的组织

标准库的所有设施都被放在名为std的命名空间中,用户可以通过模板或者头文件来访问。

# 9.3.1 命名空间

一般来说,将命名空间中的所有名字都导入全局命名空间并不是好的编程习惯。

  • std::chrono:chrono时间库,其中包括std::literals::chrono_literals
  • std::listerals::chrono_literals:后缀y表示年,d表示日,h表示小时,min表示分钟,ms表示毫秒,s表示秒,us表示微妙
  • std::literals::complex_literals:后缀i表示双精度虚数,if表示单精度虚数,il表示long double类型的虚数
  • std::literals::string_literals:后缀s表示字符串类
  • std::literals::string_view_literals:后缀sv表示字符字符串视图
  • std::numbers 提供数学常数
  • std::pmr 表示多态内存资源

要使用子命名空间中的后缀,必须将它引入当前的命名空间。

例如:

//没有引入complex_literals
auto z1 = 2+3i;								//错误:没有后缀i

using namespace literals::complex_literals;	//引入complex literals 声明的后缀
auto z2 = 2+3i;								//可行:z2是complex<double>类型的
1
2
3
4
5

# 9.3.2 ranges命名空间

标准库提供的sort()和copy(),有两个版本:

  • 传统版本,接受两个迭代器作为参数:sort(begin(v),v.end());。
  • 范围版本,接受一个单独的范围:sort(v);。

理想情况下:这两个版本(参数不同)应当可以直接重载而不需要任何特殊的动作。但是实际上不行:

using namespace std;
using namespace ranges;
void f(vector<int>& v) {
    sort(v.begin(),v.end());		// 错误:有歧义
    sort(v);						// 错误:有歧义
}
1
2
3
4
5
6

为避免使用非限定模板时造成的歧义,标准规定了范围版本必须在作用域内显示声明:

using namespace std;
void g(vector<int>& v) {
    sort(v.begin(),v.end());		// 可行
    sort(v);						// 错误:没有匹配的函数(在std命名空间内)
    ranges::sort(v);				// 可行
    using ranges::sort;				// sort(v)现在可行了
    sort(v);						// 可行
}
1
2
3
4
5
6
7
8

# 9.3.3 模块

目前为止,无任何标准库模块,作者说Cpp23很可能会弥补这个遗漏。

目前:作者使用可能称为标准的 module std。

# 9.4 建议

  • 不要重新发明轮子,应该使用库。
  • 当有选择时,优先选择标准库而不是其他库。
  • 不使用模块时,记得用#include包含相应的头文件。
  • 记住,标准库工具和方法都被定义在命名空间std中。
  • 在使用ranges时,记得显示限定算法名称。
  • (如果可用)尽量使用import模块代替#include头文件。
上次更新: 2024/6/3 14:54:44
第8章 概念和泛型编程
第2章 变量和基本类型

← 第8章 概念和泛型编程 第2章 变量和基本类型→

Theme by Vdoing | Copyright © 2023-2024 霜晨月
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式