💀 C/C++ 常见坑汇总(面试前必看)

共 77 条,按来源章节归类

C 语言

  1. 4.3 <ctype.h> —— 字符判断与转换

    ⚠️ 参数是 int,char 为负数时可能出问题,建议转 unsigned char:

  2. 4.4 <string.h> —— C 风格字符串操作

    ⚠️ strcpy、strcat 不检查缓冲区大小,易造成缓冲区溢出。

  3. 5.1 <math.h> —— 数学函数(C89 起)

    ⚠️ math.h 所有三角函数参数是 弧度 radian ,非角度。deg → rad 公式:rad = deg * PI / 180。

  4. 15.1 <stdio.h> —— C 风格输入输出

    ⚠️ 1. scanf 的变量必须加 &(取地址),否则会崩溃。 2. 正确:scanf("%d", &x); 错误:scanf("%d", x); 2. printf 的格式化符和参数类型必须匹配,否则结果未定义。 3. 比如用 %d 输出 double 会得到乱码。 4. 3. sprintf 不检查缓冲区大小,容易溢出,推荐用 snprintf。 5. 4. fopen 可能失败(文件不存在、权限不足),一定要检查返回值 是否为 NULL,不要直接使用。 6. 5. 打…

  5. 15.2 <errno.h> —— 错误码

    ⚠️ 1. 函数成功时通常不会把 errno 置0,所以调用前要手动 errno = 0。 2. errno 是全局变量,多线程中每个线程有自己的 errno(线程局部存储)。

  6. 15.5 <locale.h> —— 本地化

    ⚠️ 1. setlocale 会影响全局状态,多线程中要小心。 2. 可用的本地化名称因平台而异,Windows 和 Linux 不同。

  7. 15.7 <signal.h> —— 信号处理

    ⚠️ 1. 信号处理函数中只能做安全的操作(如设置标志位),不能调用 非异步信号安全的函数(如 printf、malloc),否则可能死锁。 2. 信号处理是全局的,会影响整个进程。 3. C++ 中信号处理和异常不能混用,信号处理函数中不能抛异常。 4. SIGKILL 和 SIGSTOP 不能被捕获或忽略。

  8. 15.8 <stdarg.h> —— 可变参数

    ⚠️ 1. 可变参数函数不知道参数的个数和类型,必须通过固定参数约定 (比如第一个参数传个数,或用特殊结束标记如 NULL)。 2. va_arg 的类型必须和实际参数类型匹配,否则未定义行为。 4. 省略号 ... 必须是最后一个参数。

  9. 15.9 <stddef.h> —— 常用类型定义

    ⚠️ 1. size_t 是无符号类型,和 int 比较时要小心(比如 size_t i; i >= 0 永远为真)。 2. C++11 后用 nullptr 替代 NULL,类型更安全。 3. offsetof 只能用于标准布局类型(standard-layout type)。 4. 这个头文件通常被其他头文件自动包含,很少需要手动 #include。

  10. 15.10 <fenv.h> —— 浮点环境控制(fenv.h,C99)

    ⚠️ 1. 浮点异常不是 C++ 异常,不会被 try/catch 捕获,只是设置标志位。 2. 修改舍入模式会影响整个线程的所有浮点运算,用完记得恢复。 3. 某些编译器需要开启特定选项才能完整支持(如 #pragma STDC FENV_ACCESS ON)。 4. 初学者一般用不到,了解有这个东西就行。

  11. 15.11 <inttypes.h> —— 定宽整数格式化(inttypes.h,C99)

    ⚠️ 1. PRId32 等宏展开后是字符串字面量,要和前面的 "%" 写在一起,中间不能有空格。 3. 这个头文件通常和 <stdint.h> 一起使用。

  12. 15.12 <stdint.h> —— 固定宽度整数(stdint.h,C99)

    ⚠️ 1. 不是所有平台都支持 int8_t 等精确宽度类型(比如某些DSP没有8位类型), 但主流平台(x86、ARM)都支持。 2. 用 printf 输出这些类型需要配合 <inttypes.h> 的 PRId32 等宏。 3. C++ 中用 std::cout 输出不需要特殊处理。

  13. 15.13 <wchar.h> —— 宽字符工具

    ⚠️ 1. wchar_t 的大小因平台而异(Windows 上是2字节,Linux 上通常是4字节)。 3. 宽字符和普通 char 字符串不能直接混用。

  14. 15.14 <wctype.h> —— 宽字符判断

    ⚠️ 1. 参数是 wint_t 类型(通常是 wchar_t 的无符号版本),传 wchar_t 即可。 2. 这些函数的行为受当前本地化(locale)影响。

  15. 15.15 <uchar.h> —— Unicode 字符转换(uchar.h,C11)

    ⚠️ 1. 这些函数在不同编译器上的支持程度不同,MSVC 早期版本支持不完善。 2. C++ 中还有 <codecvt> 头文件提供更面向对象的编码转换(但 C++17 已弃用)。 3. char16_t 和 char32_t 是 C++11 内置类型,不需要 <uchar.h> 也能用。 4. 转换失败时返回 (size_t)-1,并设置 errno。

  16. 15.16 <iso646.h> —— 运算符别名宏

    ⚠️ 1. C++ 中 and、or、not 等是关键字,不需要包含 <iso646.h>。 2. 这个头文件在 C++17 中已弃用,C++20 中已移除。 3. 纯 C 语言中必须包含 <iso646.h> 才能使用这些宏。

  17. 15.18 <stdbool.h> —— 布尔类型(stdbool.h,C99)

    ⚠️ 1. C++ 中 bool、true、false 是关键字,不需要包含 <stdbool.h>。 2. <stdbool.h> 在 C++17 中已弃用,C++20 中已移除。 3. C 语言中 _Bool 是内置类型,stdbool.h 只是提供 bool/true/false 的宏定义。 4. C 语言中 bool 变量只能存 0 或 1,赋值非 0 值会被转为 1。

  18. 15.19 <tgmath.h> —— 泛型数学宏(tgmath.h,C99)

    ⚠️ 1. C++ 中通过函数重载自动实现类型通用,不需要 <tgmath.h>。 2. <tgmath.h> 在 C++17 中已弃用,C++20 中已移除。 3. tgmath.h 的宏是通过 C11 的 _Generic 实现的(C99 用编译器内置支持)。

  19. 15.20 <stdalign.h> —— 对齐控制宏(stdalign.h,C11)

    ⚠️ 1. C++11 中 alignas 和 alignof 是关键字,不需要包含 <stdalign.h>。 2. <stdalign.h> 在 C++17 中已弃用,C++20 中已移除。 3. alignas 的值必须是 2 的幂(1、2、4、8、16、32...)。 4. 过大的对齐可能浪费内存,一般用默认对齐即可。

  20. 15.21 <stdnoreturn.h> —— 不返回函数标记(stdnoreturn.h,C11)

    ⚠️ 1. C++11 中用 [[noreturn]] 属性,不需要包含 <stdnoreturn.h>。 2. <stdnoreturn.h> 在 C++17 中已弃用,C++20 中已移除。 3. 如果标记了 noreturn 的函数实际上返回了,行为是未定义的(可能崩溃)。 4. main 函数不能标记为 noreturn。

  21. 1.1 <stdio.h> —— 标准输入输出(初学者第一站!)

    📚 C 语言的「嘴巴和耳朵」——所有和外部世界的沟通都经过它。 这是你学的第一个头文件,必须 100% 掌握。 常用函数(每个函数附完整、可编译示例) printf(fmt, ...) —— 格式化输出到屏幕 复制 #include <stdio.h> int main ( void ) { int age = 20 ; double score = 95.5 ; char name[] = "Tom" ; printf ( "姓名: %s\n" , name); print…

  22. 3.1 动态内存(malloc / calloc / realloc / free)

    👉 stdlib.h 更多(exit / atexit / system)→ ▼ 3.2 错误码 <errno.h> + perror ☆ ⬜ ☆ ⬜ ☆ ⬜ C 语言 是什么 📚 函数失败时怎么知道原因?errno 是「全局错误日志」。失败后立即查看或打印。 常用函数(每个函数附完整、可编译示例) errno / perror / strerror —— 三种查看错误方式 复制 #include <stdio.h> #include <errno.h> #include <…

  23. 4.4 <string.h> —— C 风格字符串操作

    📚 C 语言字符串函数,操作以 '\0' 结尾的字符数组。 📚 C++ 推荐用 string,但和 C 代码交互时还会遇到。 常用函数(每个函数附完整示例) strlen(s) —— 字符串长度(不含 '\0') 复制 #include < string .h> #include <stdio.h> int main () { char src[ 50 ] = "Hello" ; int n = strlen (src); // n = 5 printf ( "长度:%d\n…

  24. 5.1 <math.h> —— 数学函数(C89 起)

    📚 浮点数学库:幂/开方/三角/对数/取整/取余/拆分。 某些 Linux 平台编译需要链接 -lm。 常用函数(每个函数附完整、可编译示例) fabs(x) 绝对值 —— 绝对值 复制 #include <stdio.h> #include <math.h> int main ( void ) { printf ( "| -3.14 | = %.2f\n" , fabs (- 3.14 )); printf ( "| 2.71 | = %.2f\n" , fabs ( 2.…

  25. 5.2 <stdlib.h> —— 随机数与通用工具

    常用函数(每个函数附完整示例) rand() —— 生成 0 到 RAND_MAX 的随机整数 复制 #include <stdlib.h> #include <stdio.h> int main () { int r = rand (); printf ( "随机数:%d\n" , r); return 0 ; } srand(seed) —— 设置随机数种子(不设则每次序列相同) 复制 #include <stdlib.h> #include <time.h> #incl…

  26. 15.2 <errno.h> —— 错误码

    📚 很多库函数失败时会设置一个全局变量 errno, 你可以通过检查 errno 的值来判断具体出了什么错。 📚 C 语言中叫 。 类比 🏠 就像快递员送件失败后,会在系统里填一个"失败原因代码" (比如"地址不存在""客户拒收"),你查这个代码就知道为啥失败了。 常用错误码(每个附完整示例) errno —— 全局错误码变量 函数失败时被设置,成功时通常不修改(所以调用前最好先置0)。 复制 #include <errno.h> #include <math.h> #inc…

  27. 15.3 <float.h> —— 浮点数限制

    📚 C 语言中叫 。 类比 🏠 就像水杯的"容量参数表":最大装多少、最小刻度是多少、 精度能到小数点后几位。 常用宏(每个附完整示例) FLT_MAX / DBL_MAX / LDBL_MAX —— 各类型最大正值 复制 #include < float .h> #include <stdio.h> int main () { printf ( "float 最大值:%e\n" , FLT_MAX); printf ( "double 最大值:%e\n" , DBL_MAX…

  28. 15.6 <setjmp.h> —— 非局部跳转

    📚 C 语言中叫 。 类比 🏠 就像游戏里的"存档点":先在某个位置存档(setjmp), 后面遇到危险可以直接读档回到这个位置(longjmp)。 常用函数(每个附完整示例) setjmp(env) —— 保存当前执行环境到 env,第一次调用返回0 env 是 jmp_buf 类型变量。 复制 #include <setjmp.h> #include <stdio.h> jmp_buf env; void do_something () { printf ( "执行中..…

  29. 15.8 <stdarg.h> —— 可变参数

    📚 C 语言中叫 。 类比 🏠 就像一个"万能收纳盒",不管你放多少东西进去,它都能装下, 你可以按顺序一个个拿出来。 常用宏(每个附完整示例) va_list —— 可变参数列表类型 用来保存可变参数的状态。 复制 #include <stdarg.h> #include <stdio.h> // 计算任意个整数的和,第一个参数是参数个数 int sum ( int count, ...) { va_list args; va_start (args, count); //…

  30. 15.9 <stddef.h> —— 常用类型定义

    📚 很多其他头文件都会自动包含它,所以通常不需要手动包含。 📚 C 语言中叫 。 类比 🏠 就像工具箱里的"通用零件":螺丝、螺母、垫片,到处都要用, 但你不会专门去买,通常随其他工具一起送。 常用类型和宏(每个附完整示例) size_t —— 无符号整数类型,表示大小/计数 sizeof 运算符返回的类型,数组下标、字符串长度都用它。 复制 #include <stddef.h> #include <stdio.h> int main () { size_t len = s…

  31. 15.10 <fenv.h> —— 浮点环境控制(fenv.h,C99)

    📚 可以获取和设置浮点数的舍入方式,检测是否发生了除零、溢出等异常。 📚 C 语言中叫 。 类比 🏠 就像计算器的"设置菜单":可以设置四舍五入还是向上取整, 还能查看之前计算时有没有出错(除零、溢出等)。 常用函数和宏(每个附完整示例) feclearexcept(exceptions) —— 清除指定的浮点异常标志 🎯 exceptions:FE_DIVBYZERO(除零)、FE_INEXACT(不精确)、FE_INVALID(无效)、 FE_OVERFLOW(上溢)、F…

  32. 15.11 <inttypes.h> —— 定宽整数格式化(inttypes.h,C99)

    📚 C 语言中叫 。 类比 🏠 就像不同型号的电池需要不同的充电器:int32_t、int64_t 等定宽整数 在 printf 中需要用专门的格式化宏,不能直接用 %d 或 %ld。 常用格式化宏(每个附完整示例) PRIdN / PRIuN / PRIxN —— printf 格式化宏(d=有符号十进制,u=无符号,x=十六进制) 🎯 N 可以是 8、16、32、64、FAST8、FAST16、FAST32、FAST64、LEAST8 等, 还有 MAX(最大宽度)、PT…

  33. 15.12 <stdint.h> —— 固定宽度整数(stdint.h,C99)

    📚 C 语言中叫 。 类比 🏠 就像标准尺寸的螺丝:M3、M4、M5,不管哪个厂家生产,尺寸都一样。 🏠 int 在不同平台可能是16位、32位或64位,但 int32_t 永远是32位。 常用类型(每个附完整示例) intN_t / uintN_t —— 精确宽度整数(N=8,16,32,64) 🎯 intN_t 是有符号,uintN_t 是无符号,恰好占 N 位。 复制 #include <stdint.h> #include <stdio.h> int main () …

  34. 15.13 <wchar.h> —— 宽字符工具

    📚 用于处理 Unicode 等多字节字符集。 📚 C 语言中叫 。 类比 🏠 如果说 char 是"单人间"(只能放ASCII字符),那 wchar_t 就是"套间" (能放更大的字符,如中文、日文)。 🏠 <wchar.h> 就是宽字符版的工具箱。 常用函数(每个附完整示例) wcslen(s) —— 宽字符串长度 复制 #include <wchar.h> #include <stdio.h> int main () { const wchar_t * s = L "H…

  35. 15.14 <wctype.h> —— 宽字符判断

    📚 判断宽字符是否是字母、数字、空格等,以及大小写转换。 📚 C 语言中叫 。 类比 🏠 <ctype.h> 是"普通字符的分类器",<wctype.h> 就是"宽字符的分类器", 能识别中文、日文等宽字符的属性。 常用函数(每个附完整示例) iswalpha(c) —— 是否是字母 复制 #include <wctype.h> #include <stdio.h> int main () { wchar_t c = L 'A' ; wprintf (L "iswalpha(…

  36. 15.15 <uchar.h> —— Unicode 字符转换(uchar.h,C11)

    📚 C 语言中叫 (C11 新增)。 类比 🏠 就像翻译官:能把 UTF-8 编码的字符翻译成 UTF-16 或 UTF-32, 也能反过来翻译。 常用类型和函数(每个附完整示例) char16_t / char32_t —— 16位/32位字符类型(C++11 内置类型) 复制 #include <uchar.h> #include <stdio.h> int main () { printf ( "char16_t 大小:%d 字节\n" , sizeof ( char1…

  37. 15.15 <uchar.h> —— Unicode 字符转换(uchar.h,C11)

    以下头文件在 C++17 中已弃用,C++20 中已移除,因为 C++ 有更好的替代方案。 但在纯 C 语言中仍然常用,下面逐个详解: ▼ 15.16 <iso646.h> —— 运算符别名宏 ☆ ⬜ ☆ ⬜ ☆ ⬜ C 语言 是什么 📚 C 语言中为了方便不支持某些符号的键盘和字符集,提供了运算符的文字别名。 📚 比如 and 代替 &&,or 代替 ||,not 代替 !。 📚 在 C++ 中这些是关键字,不需要包含头文件;但在 C 语言中需要包含 <iso646.h>。…

  38. 15.17 <complex.h> —— 复数运算(complex.h,C99)

    📚 C 语言中用 _Complex 关键字定义复数,C++ 中用 std::complex 类。 📚 <complex.h> 是 C++ 对 C 语言 <complex.h> 的兼容版本。 ⚠️ 注意:下面的代码示例使用 C 语言语法(double complex、I 宏),因为 <complex.h> 是 C 兼容头文件。

  39. 15.17 <complex.h> —— 复数运算(complex.h,C99)

    在纯 C++ 中这些代码可能无法编译,C++ 程序员应使用 <complex> 头文件的 std::complex 类。 类比 🏠 如果说普通数学是"实数的世界",那 complex.h 就是"复数的世界"。 🏠 它让你能直接计算带虚数 i 的数学问题,比如 sqrt(-1) = i。 C 语言复数类型 类型 说明 float _Complex 单精度复数(float 实部+虚部) double _Complex 双精度复数(最常用) long double _Complex…

  40. 15.19 <tgmath.h> —— 泛型数学宏(tgmath.h,C99)

    📚 它让你用一个函数名(如 sqrt)自动根据参数类型调用对应的函数版本。 📚 比如 sqrt(x):x 是 float 调 sqrtf,x 是 double 调 sqrt,x 是 long double 调 sqrtl。 类比 🏠 就像自动售货机:你投入不同大小的硬币,它自动识别并给出对应商品。 🏠 tgmath.h 让你不用手动区分 sqrtf/sqrt/sqrtl,写一个 sqrt 就行。 为什么需要 📌 C 语言中数学函数有三个版本: - float 版本:sqrtf…

  41. 15.20 <stdalign.h> —— 对齐控制宏(stdalign.h,C11)

    📚 提供 alignas 和 alignof 两个宏,用于控制变量的内存对齐方式。 📚 内存对齐影响数据访问速度和某些硬件要求。 类比 🏠 如果说内存是"停车场",对齐就是"车位大小"。 🏠 4 字节对齐的变量只能停在 4 的倍数车位,虽然可能浪费一点空间,但访问更快。 🏠 alignas 就是"指定车位大小",alignof 就是"查询某车型需要多大车位"。 定义的宏 宏名 说明 alignas 指定变量或类型的对齐字节数(C++ 中是关键字) alignof 查询类型的对…

  42. 15.21 <stdnoreturn.h> —— 不返回函数标记(stdnoreturn.h,C11)

    📚 比如 exit()、abort() 这类函数,调用后程序直接结束,不会返回到调用点。 📚 标记后编译器可以做更好的优化(不需要保存返回地址等)。 类比 🏠 如果说普通函数是"借出去的东西会还回来",那 noreturn 函数就是"肉包子打狗——有去无回"。 🏠 告诉编译器:这个函数调用后不用等它返回,直接处理后续逻辑或结束。 定义的宏 宏名 说明 noreturn 标记函数不返回(C++ 中用 [[noreturn]] 属性) __noreturn_is_defined …

C++ 标准库

  1. 1.1 <iostream> —— 最基础的输入输出

    ⚠️ cin >> 遇到空格、回车、Tab 就会停下来,一次只读一个"词"。

  2. 1.2 <iomanip> —— 控制输出格式(排版美化)

    ⚠️ 单独用 setprecision 控制"有效数字"总位数;配合 fixed 才控制"小数点后"位数。

  3. 1.3 <fstream> —— 读写文件

    ⚠️ 默认会清空文件原有内容!想追加用 ios::app 模式。

  4. 2.1 <vector> —— 动态数组(最常用!)

    ⚠️ [] 越界访问是未定义行为,可能崩溃;at() 越界会抛异常,更安全。

  5. 2.10 <map> / <multimap> —— 有序字典

    ⚠️ [] 有副作用:key 不存在时会自动插入并设为默认值。

  6. 3.1 <algorithm> —— 通用算法

    ⚠️ remove 不会真正删除,只是把要保留的移到前面,返回新末尾迭代器。

  7. 4.1 <string> —— 字符串(最常用!)

    ⚠️ 1. - 下标从 0 开始 - 中文 UTF-8 编码下一个字占3字节,size() 返回字节数不是字数 - 大量拼接用 += 或 append,不要用 s = s + "..."(会创建临时对象)

  8. 4.2 <string_view> —— 字符串视图(C++17)

    ⚠️ string_view 不拥有数据,原字符串销毁后它就失效(悬空)。

  9. 4.3 <cctype> —— 字符判断与转换

    ⚠️ 参数是 int,char 为负数时可能出问题,建议转 unsigned char:

  10. 4.4 <cstring> —— C 风格字符串操作

    ⚠️ strcpy、strcat 不检查缓冲区大小,易造成缓冲区溢出。

  11. 5.1 <cmath> —— 数学函数

    ⚠️ 三角函数用弧度不是角度。

  12. 5.2 <cstdlib> —— 随机数与通用工具

    ⚠️ rand() 随机性不太好,C++11 推荐用 <random>。

  13. 8.1 <thread> —— 线程

    ⚠️ 创建了线程必须 join 或 detach,否则程序崩溃。

  14. 8.3 <condition_variable> —— 条件变量

    ⚠️ wait 可能被虚假唤醒,一定要用带条件判断的版本(第二个参数)。

  15. 9.5 <variant> —— 类型安全联合体(C++17)

    ⚠️ get<类型>() 类型不对会抛 bad_variant_access。

  16. 11.1 <typeinfo> —— 运行时类型识别

    ⚠️ typeid 的 name() 返回字符串不标准,GCC 下可能是 "i"、"NSt7..." 等不太可读。

  17. 12.1 <regex> —— 正则表达式

    ⚠️ C++字符串中 \ 要写成 \\,或用原始字符串 R"(\d+)"

  18. 1.1 <iostream> —— 最基础的输入输出

    📚 iostream = input + output + stream,即"输入输出流"。 📚 可以把它想象成一根水管:数据像水一样在程序和你之间流动。 cin —— 标准输入(从键盘读数据) 🎯 类比:程序的"眼睛",看你在键盘上打了什么。 📌 说明: • 用法:cin >> 变量; 复制 // 完整可运行程序:演示 cin 的基本用法 #include <iostream> #include < string > using namespace std; int mai…

  19. 1.1 <iostream> —— 最基础的输入输出

    🎯 类比:程序的"嘴巴",把信息说给你听。 📌 说明: • 用法:cout << 要显示的内容; 复制 // 完整可运行程序:演示 cout 的基本用法 #include <iostream> #include < string > using namespace std; int main () { // 场景1:输出字符串 cout << "Hello" << endl ; // 屏幕显示 Hello // 场景2:输出字符串和变量拼接 cout << "年龄:" << …

  20. 1.1 <iostream> —— 最基础的输入输出

    • endl 不只是换行,还会"刷新缓冲区"(强制立刻显示) • 大量输出时频繁用 endl 会稍慢,只想换行推荐用 '\n' • 比如循环输出10000行,用 '\n' 比 endl 快不少 flush —— 刷新缓冲区 🎯 一句话理解:flush 是"催一下",让缓冲区里的内容立刻显示出来。 📌 什么时候用? • 一般不需要手动调用,endl 会自动刷新 • 特殊场景:输出提示后不换行,但想立刻让用户看到(如"正在加载...") • 比如进度条、等待提示等场景 复制 #i…

  21. 1.2 <iomanip> —— 控制输出格式(排版美化)

    🎯 n 只能是 8、10、16。 💡 小贴士: • 也可以直接用 hex / oct / dec。 复制 #include <iostream> #include <iomanip> using namespace std; int main () { cout << setbase ( 16 ) << 255 << endl ; // 输出 ff(十六进制) cout << setbase ( 8 ) << 255 << endl ; // 输出 377(八进制) cout…

  22. 1.3 <fstream> —— 读写文件

    模式 说明 ios::in 读模式(ifstream 默认) ios::out 写模式(ofstream 默认,清空原内容) ios::app 追加模式(末尾添加,不清空) ios::trunc 截断模式(清空原内容) ios::binary 二进制模式(默认文本模式) 读文件的三种方式 方式一:>> 逐个读(遇空格/换行停止) 复制 #include <fstream> #include <iostream> #include < string > using namesp…

  23. 2.1 <vector> —— 动态数组(最常用!)

    2. 三种遍历方式 // 方式一:下标遍历 [示例] #include <vector> #include <iostream> using namespace std; int main() { vector<int> v = {10, 20, 30}; for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; } cout << endl; return 0; } // 方式二:范围 for(C++11,推荐) […

  24. 2.10 <map> / <multimap> —— 有序字典

    2. 场景:需要 key-value 映射且 key 要排序、需要范围查询 ▼ 2.11 <unordered_set> / <unordered_multiset> —— 无序集合(C++11) ☆ ⬜ ☆ ⬜ ☆ ⬜ C++ 是什么 📚 和 set 功能一样(存不重复元素),但底层是哈希表,元素不排序。 📚 类比:不排序的收纳盒,但找东西特别快。 和 set 的区别 unordered_set:平均 O(1) 查找,元素无序,内存稍大 set: O(log n) 查找,元…

  25. 3.1 <algorithm> —— 通用算法

    2. 通常先排序再去重: sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); [示例] #include <algorithm> #include <vector> #include <iostream> using namespace std; int main() { vector<int> v={1,1,2,2,3}; sort(v.begin(), v.end()); v.er…

  26. 4.2 <string_view> —— 字符串视图(C++17)

    📚 类比:给你一张写着文字的纸的"照片",能看不能改,也不用复印。 为什么需要 函数参数用 string 会拷贝一份,浪费时间内存。 用 string_view 不拷贝,直接"看"原字符串。 复制 #include <string_view> #include <iostream> #include < string > using namespace std; void print (string_view sv) { cout << sv << endl ; } int …

  27. 4.3 <cctype> —— 字符判断与转换

    一组函数,判断单个字符是什么类型,或转换大小写。 常用函数(每个函数附完整示例) isalpha(c) —— 是否字母(a-z, A-Z) 复制 #include <cctype> #include <iostream> using namespace std; int main () { char c = 'A' ; if ( isalpha (( unsigned char )c)) cout << "是字母" << endl ; return 0 ; } isdigit…

  28. 4.4 <cstring> —— C 风格字符串操作

    📚 C 语言字符串函数,操作以 '\0' 结尾的字符数组。 📚 C++ 推荐用 string,但和 C 代码交互时还会遇到。 常用函数(每个函数附完整示例) strlen(s) —— 字符串长度(不含 '\0') 复制 #include <cstring> #include <iostream> using namespace std; int main () { char src[ 50 ] = "Hello" ; int n = strlen (src); // n = …

  29. 5.1 <cmath> —— 数学函数

    常用函数一览(每个函数附完整示例) 【基本】 abs(x) / fabs(x) —— 绝对值(fabs 专门用于浮点) 复制 #include <cmath> #include <iostream> using namespace std; int main () { int a = abs (- 5 ); // a = 5 double b = fabs (- 3.14 ); // b = 3.14 cout << "a=" << a << ", b=" << b << e…

  30. 5.1 <cmath> —— 数学函数

    2. C++20 可用 <numbers> 中的 std::numbers::pi。 ▼ 5.2 <cstdlib> —— 随机数与通用工具 ☆ ⬜ ☆ ⬜ ☆ ⬜ C 兼容 常用函数(每个函数附完整示例) rand() —— 生成 0 到 RAND_MAX 的随机整数 复制 #include <cstdlib> #include <iostream> using namespace std; int main () { int r = rand (); cout << "随…

  31. 5.3 <random> —— 高质量随机数(C++11)

    📚 两部分:随机数引擎(生成原始随机数)+ 分布(映射到想要的范围) 随机数引擎(每个附完整示例) mt19937 / mt19937_64 —— 梅森旋转(最常用,32/64位) 复制 #include <random> #include <iostream> using namespace std; int main () { mt19937 rng ( 42 ); // 用固定种子42创建引擎 int r = rng (); // 生成一个随机数 cout << "随机…

  32. 8.2 <mutex> —— 互斥锁

    为什么需要锁 多线程同时修改同一变量会出问题(数据竞争)。 锁保证同一时间只有一个线程访问共享数据。 类比:公共厕所,一个人进去锁门,其他人等。 mutex —— 普通互斥锁 复制 #include < mutex > #include <iostream> using namespace std; int main () { mutex mtx; mtx. lock (); // 加锁(已被锁则等待) // 操作共享数据 cout << "已加锁" << endl ; mt…

  33. 8.4 <future> —— 异步任务

    📚 类比:餐厅点菜给你取餐号(future),饭做好了凭号取。 async —— 异步执行函数 复制 #include < future > #include <iostream> using namespace std; int main () { future < int > f = async ([]{ return 42 ; }); // 后台执行 // ... 做其他事 ... int result = f. get (); // 取结果(没好会等待) cout <…

  34. 9.6 <any> —— 任意类型容器(C++17)

    📚 类比:"万能盒子",什么都能装,但取时要知道装的是什么。 复制 #include < any > #include < string > #include <iostream> using namespace std; int main () { any a; a = 42 ; a = string ( "hello" ); a = 3.14 ; if (a. type () == typeid ( int )) cout << any_cast< int >(a) <<…

  35. 12.1 <regex> —— 正则表达式

    📚 类比:高级搜索框,用规则描述"我要找什么样的文字"。 regex —— 正则表达式对象 复制 #include < regex > #include < string > #include <iostream> using namespace std; int main () { regex pattern ( "\\d+" ); // 匹配一个或多个数字 cout << "正则表达式已创建" << endl ; return 0 ; } ⚠️ C++字符串中 \ 要写成…

← 返回首页