C++标准库实用指南:从基础头文件到STL容器
立即解锁
发布时间: 2025-08-22 00:43:47 阅读量: 2 订阅数: 16 


深入解析C++标准库:从入门到精通
### C++标准库实用指南:从基础头文件到STL容器
#### 1. 兼容C语言的头文件
在C++编程中,有几个与C语言兼容的头文件经常被使用,它们分别是 `<cstddef>`、`<cstdlib>` 和 `<cstring>`。这些头文件是C语言头文件 `<stddef.h>`、`<stdlib.h>` 和 `<string.h>` 的C++版本,定义了一些常见的常量、宏、类型和函数。
##### 1.1 `<cstddef>` 头文件定义
| 标识符 | 含义 |
| --- | --- |
| NULL | 表示“未定义”或“无值”的指针值 |
| nullptr_t | nullptr 的类型(自C++11起) |
| size_t | 用于表示大小单位的无符号类型,如元素数量 |
| ptrdiff_t | 用于表示指针差值的有符号类型 |
| max_align_t | 在所有上下文中具有最大对齐方式的类型(自C++11起) |
| offsetof(type,mem) | 结构体或联合类型中成员 mem 的偏移量 |
在C++11之前,NULL 常被用来表示指针不指向任何对象。自C++11起,引入了 nullptr 来实现相同的语义。需要注意的是,在C++中,NULL 保证为值 0(可以是 int 或 long 类型),而在C语言中,NULL 常被定义为 `(void*)0`,这在C++中是不正确的,因为C++要求 NULL 的类型为整数类型,否则无法将其赋值给指针。自C++11起,建议使用 nullptr 替代 NULL。
##### 1.2 `<cstdlib>` 头文件定义
| 定义 | 含义 |
| --- | --- |
| EXIT_SUCCESS | 表示程序正常结束 |
| EXIT_FAILURE | 表示程序异常结束 |
| exit (int status) | 退出程序(清理静态对象) |
| quick_exit (int status) | 根据 at_quick_exit() 进行清理后退出程序(自C++11起) |
| _Exit (int status) | 不进行清理直接退出程序(自C++11起) |
| abort() | 终止程序(在某些系统上可能强制崩溃) |
| atexit (void (*func)()) | 在程序退出时调用 func |
| at_quick_exit (void (*func)()) | 在 quick_exit() 时调用 func(自C++11起) |
atexit() 注册的函数会在程序正常终止时按注册的逆序调用,无论程序是通过调用 exit() 还是 main() 结束。exit() 会销毁所有静态对象、刷新所有缓冲区、关闭所有I/O通道并终止程序,同时会调用 atexit() 注册的函数。abort() 则会立即终止程序,不进行任何清理。自C++11起,quick_exit() 不会销毁对象,而是按逆序调用 at_quick_exit() 注册的函数,然后调用 _Exit() 终止程序,不进行任何销毁或清理。
##### 1.3 `<cstring>` 头文件定义
| 定义 | 含义 |
| --- | --- |
| memchr (const void* ptr, int c, size_t len) | 在 ptr 的前 len 个字节中查找字符 c |
| memcmp (const void* ptr1, const void* ptr2, size_t len) | 比较 ptr1 和 ptr2 的前 len 个字节 |
| memcpy (void* toPtr, const void* fromPtr, size_t len) | 将 fromPtr 的前 len 个字节复制到 toPtr |
| memmove (void* toPtr, const void* fromPtr, size_t len) | 将 fromPtr 的前 len 个字节复制到 toPtr(区域可能重叠) |
| memset (void* ptr, int c, size_t len) | 将字符 c 赋值给 ptr 的前 len 个字节 |
这些函数主要用于进行内存的设置、复制和移动操作。
#### 2. 标准模板库(STL)概述
标准模板库(STL)是C++标准库的核心部分,它是一个通用库,提供了使用现代高效算法管理数据集合的解决方案。从程序员的角度来看,STL 提供了一系列满足不同需求的集合类以及操作这些集合的算法。STL 的所有组件都是模板,因此可以用于任意元素类型。
STL 基于容器、迭代器和算法这几个结构良好的组件的协作:
- **容器**:用于管理特定类型的对象集合。不同类型的容器有各自的优缺点,反映了程序中对集合的不同需求。容器可以实现为数组、链表,或者为每个元素设置特殊的键。
- **迭代器**:用于遍历对象集合的元素。这些集合可以是容器或容器的子集。迭代器的主要优点是为任意容器类型提供了一个小而通用的接口。例如,通过该接口的一个操作可以让迭代器移动到集合中的下一个元素,而无需考虑集合的内部结构。迭代器的接口与普通指针几乎相同,通过 `operator ++` 递增迭代器,通过 `operator *` 访问迭代器的值。
- **算法**:用于处理集合的元素。例如,算法可以进行搜索、排序、修改或使用元素实现各种目的。算法使用迭代器,由于迭代器接口对所有容器类型都是通用的,因此算法只需编写一次即可用于任意容器。为了给算法提供更多的灵活性,可以提供一些辅助函数供算法调用。
STL 的概念基于数据和操作的分离,数据由容器类管理,操作由可配置的算法定义,迭代器则是连接这两个组件的桥梁。
#### 3. STL 容器
STL 提供了不同类型的容器,以满足不同的需求,主要分为以下三种类型:
- **序列容器**:元素具有特定的位置,该位置取决于插入的时间和位置,与元素的值无关。STL 中预定义的序列容器类有 array、vector、deque、list 和 forward_list。
- **关联容器**:元素的位置取决于其值(如果是键值对,则取决于键),根据特定的排序标准进行排序。插入顺序不影响元素的顺序。STL 中预定义的关联容器类有 set、multiset、map 和 multimap。
- **无序(关联)容器**:元素的位置无关紧要,重要的是特定元素是否存在于集合中。插入顺序和元素值都不影响元素的位置,并且元素的位置可能在容器的生命周期内发生变化。STL 中预定义的无序容器类有 unordered_set、unordered_multiset、unordered_map 和 unordered_multimap。
##### 3.1 序列容器
序列容器的常见类型包括向量(vector)、双端队列(deque)、数组(array)、列表(list)和前向列表(forward_list)。
**向量(vector)**:
向量将元素存储在动态数组中,支持随机访问,即可以通过索引直接访问每个元素。在数组末尾添加和删除元素非常快,但在数组中间或开头插入元素需要移动后续元素,因此时间开销较大。
```cpp
// stl/vector1.cpp
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> coll; // vector container for integer elements
// append elements with values 1 to 6
for (int i=1; i<=6; ++i) {
coll.push_back(i);
}
// print all elements followed by a space
for (int i=0; i<coll.size(); ++i) {
cout << coll[i] << ' ';
}
cout << endl;
}
```
**双端队列(deque)**:
双端队列是一种动态数组,可以在两端增长。因此,在队列的末尾和开头插入元素都很快,但在中间插入元素需要移动元素,时间开销较大。
```cpp
// stl/deque1.cpp
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque<float> coll; // deque container for floating-point elements
// insert elements from 1.1 to 6.6 each at the front
for (int i=1; i<=6; ++i) {
coll.push_front(i*1.1); // insert at the front
}
// print all elements followed by a space
for (int i=0; i<coll.size(); ++i) {
cout << coll[i] << ' ';
}
cout << endl;
}
```
**数组(array)**:
数组管理固定大小的元素集合,不能改变元素的数量,只能修改元素的值。因此,在创建数组时需要指定其大小。数组也支持随机访问。
```cpp
// stl/array1.cpp
#include <array>
#include <string>
#inclu
```
0
0
复制全文
相关推荐










