cpp_basic_4

2025-07-06

C++ 标准库

在 C++ 中,标准库(Standard Library)是一个非常重要的组成部分。标准库提供了大量的预定义函数和类,可以帮助我们更高效地完成各种任务,为了使用这些功能,我们需要在程序中导入相应的标准库头文件。

  • 什么是C++标准库?

C++ 标准库是 C++ 语言的一部分,它包含了一系列的类和函数,用于处理常见的编程任务,如输入输出、字符串操作、数学计算、容器管理等。标准库的设计目标是提供高效、可移植和易于使用的工具,以帮助开发者快速构建应用程序。

1 导入 C++ 标准库

  • 使用 #include 包含头文件

在 C++ 中,使用 #include 预处理指令来导入标准库头文件。#include 指令告诉编译器在编译时将指定的头文件内容插入到当前文件中,头文件通常包含函数声明、类定义、宏定义等内容。

导入 C++ 标准库语法格式如下:

#include <header_file>  // <header_file>是标准库头文件的名称

#include <iostream> // 提供了输入输出流的功能,如std::cout和std::cin
#include <vector>   // <vector>:提供了向量容器的实现,用于存储动态数组
#include <cmath>    // <cmath>:提供了常用的数学函数,如sqrt()、sin()、cos()等
  • 使用模块导入标准库(C++20/C++23)

从 C++20 开始,C++ 引入了模块(Modules),并在 C++23 中进一步完善了对标准库模块的支持。模块提供了一种更高效、更安全的方式来导入标准库。

  • 编译速度更快:模块只编译一次,后续导入时直接使用编译好的二进制接口。
  • 隔离性更好:模块不会泄露宏定义和私有符号,避免了命名冲突。
  • 依赖关系清晰:模块的导入和导出机制使得代码的依赖关系更加清晰。
import std;

int main() {
    std::cout << "Hello, C++23 Modules!\n"; // 使用 std::cout 输出
    return 0;
}

导入标准库的特定部分:

import std.core;    // 导入核心库
import std.iostream;    // 导入输入输出流库

int main() {
    std::cout << "Hello, C++23 Modules!\n";
    return 0;
}

目前,主流编译器对 C++ 模块的支持正在逐步完善。以下是一些编译器的支持情况和使用方法:

  • gcc: 需要启用 C++23 标准和模块支持。编译命令示例:
g++ -std=c++23 -fmoudles-ts -o main.o main.cpp
  • clang: 需要启用 C++23 标准和模块支持。编译命令示例:
clang++ -std=c++23 -fmoudles -o main.o main.cpp
  • MSVC(Visual Studio): 需要启用 C++23 标准和模块支持。编译命令示例:
cl /std:c++23 /experimental:module /EHsc /Fe:main.o main.cpp

2 常见的C++标准库头文件

  • <iostream>

<iostream>提供了输入输出流的功能。通过这个头文件,可以使用std::coutstd::cin来进行标准输出和输入。

  • <vector>

<vector>提供了向量容器的实现。向量是一个动态数组,可以在运行时动态调整大小。它提供了许多有用的成员函数,如push_back()size()等。

  • <cmath>

<cmath>提供了常用的数学函数,如平方根、三角函数、指数函数等。这些函数通常用于数值计算。

#include <iostream>
#include <cmath>

int main() {
    double x = 3;
    double y = std::sqrt(x);
    std::cout << "Square root of " << x << " is " << y << std::endl;
    return 0;
}
  • <string>

<string>提供了字符串类的实现。C++中的字符串类std::string比C语言中的字符数组更易于使用,并且提供了许多有用的成员函数,如length()substr()等.

  • <algorithm>

<algorithm>提供了许多常用的算法,如排序、查找、遍历等。这些算法可以应用于各种容器,如向量、列表等。

注意:

  • 命名空间:C++标准库中的函数和类通常位于std命名空间中。因此,在使用这些函数和类时,通常需要加上std::前缀,或者使用using namespace std;来避免重复输入std::

  • 头文件保护:在编写自己的头文件时,通常需要使用头文件保护(Header Guards)来防止重复包含。标准库头文件已经包含了这些保护机制,因此我们不需要担心重复包含的问题。

  • 兼容性:C++标准库在不同的编译器和平台上可能会有一些差异。因此,在编写跨平台的代码时,需要注意这些差异,并确保代码在不同环境下都能正常工作。

3 常用标准库

C++ 标准库可以分为两部分:

  • 标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。
  • 面向对象类库: 这个库是类及其相关函数的集合。

C++ 标准库包含了所有的 C 标准库,为了支持类型安全,做了一定的添加和修改。

以下是 C++ 标准库的主要组件分类及对应的头文件列表:

  • 输入输出
    • <iostream>: 标准输入输出流
    • <fstream>: 文件输入输出流
    • <sstream>: 字符串流
    • <iomanip>: 输入输出流格式化
  • 容器
    • <array>: 定长数组容器
    • <vector>: 动态数组容器
    • <deque>: 双端队列容器
    • <list>: 双向链表容器
    • <forward_list>: 单向链表容器
    • <stack>: 栈容器适配器
    • <queue>: 队列容器适配器
    • <priority_queue>: 优先队列容器适配器
    • <set>: 集合容器(基于平衡二叉树)
    • <unordered_set>: 无序集合容器(基于哈希表)
    • <map>: 映射容器(键值对,基于平衡二叉树)
    • <unordered_map>: 无序映射容器(基于哈希表)
    • <bitset>: 二进制位容器
  • 算法和迭代器
    • <algorithm>: 常用算法(如排序、查找等)
    • <iterator>: 迭代器
  • 函数对象和绑定
    • <functional>: 定义函数对象及相关工具
  • 数学和数值运算
    • <numeric>: 数值操作(如累计、乘积等)
    • <complex>: 复数运算
    • <valarray>: 数组类及相关操作
    • <cmath>: 数学函数
  • 字符串和正则表达式
    • <string>: 标准字符串类
    • <regex>: 正则表达式
  • 时间和日期
    • <ctime>: 时间处理 * <chrono>: 时间库
  • 多线程和并发
    • <thread>: 多线程支持
    • <mutex>: 互斥量
    • <condition_variable>: 条件变量
    • <future>: 异步编程支持
    • <atomic>: 原子操作
  • 内存管理
    • <memory>: 智能指针及动态内存管理
    • <new>: 动态内存分配
  • 类型特性和运行时类型识别
    • <type_traits>: 类型特性
    • <typeinfo>: 运行时类型识别
  • 异常处理
    • <exception>: 异常处理基类及相关工具 * <stdexcept>: 常用异常类(如 std::runtime_error 等)
  • 输入输出操作
    • <cstdio>: C 风格输入输出
    • <cstdint>: 定长整数类型
  • 其他工具
    • <utility>: 通用工具(如 std::pair 和 std::move 等)
    • <random>: 随机数生成
    • <locale>: 本地化支持
    • <codecvt>: 字符编码转换
    • <cassert>: 断言
    • <cctype>: 字符处理
    • <cstring>: 字符串处理
    • <cwchar>: 宽字符处理
    • <climits>: 数值极限
    • <cfloat>: 浮点极限
    • <cstdlib>: 常用工具(如 std::rand 和 std::abs 等)

这些头文件构成了C++标准库的基础,提供了丰富的功能。

4 C++ 标准库

4.1 标准输入输出 – <iostream>

  • 主要类
    • std::istream:用于输入操作的抽象基类。
    • std::ostream:用于输出操作的抽象基类。
    • std::iostream:继承自std::istreamstd::ostream,用于同时进行输入和输出操作。
    • std::cin:标准输入流对象,通常与键盘关联。
    • std::cout:标准输出流对象,通常与屏幕关联。
    • std::cerr:标准错误输出流对象,不带缓冲,通常与屏幕关联。
    • std::clog:标准日志流对象,带缓冲,通常与屏幕关联。
  • 常用操作符
    • >>:输入操作符,从输入流读取数据。
    • <<:输出操作符,将数据写入输出流。
  • 格式化输出:

    使用<iomanip>库可以对输出进行格式化,例如设置宽度、精度和对齐方式。

#include <iostream>
#include <iomanip>

int main() {
    double pi = 3.14159;

    // 设置输出精度
    std::cout << std::setprecision(3) << pi << std::endl;

    // 设置输出宽度和对齐方式
    std::cout << std::setw(10) << std::left << pi << std::endl;
    std::cout << std::setw(15) << std::right << pi << std::endl;

    return 0;
}

输出:

3.14
3.14
           3.14
  • 流的状态检查

可以检查输入输出流的状态,以确定操作是否成功。

#include <iostream>

int main() {
    int num;
    std::cout << "Enter a number: ";
    std::cin >> num;

    // 检查输入操作是否成功
    if (std::cin.fail()) {
        std::cerr << "Invalid input!" << std::endl;
    } else {
        std::cout << "You entered: " << num << std::endl;
    }
    return 0;
}

  • 处理字符串输入

使用std::getline函数可以读取包含空格的整行输入

#include <iostream>
#include <string>

int main() {
    std::string fullName;
    std::cout << "Enter your full name: ";
    std::getline(std::cin, fullName);
    std::cout << "Hello, " << fullName << "!" << std::endl;
    return 0;
}