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::cout
和std::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::istream
和std::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;
}