C++库知识点整理

本文是对我学到过的所有C++的库的知识点整理,对自己来说也算是复习一遍

1.vector:C++ vector是STL中最常用的动态连续数组容器,底层基于连续内存实现,核心特性为支持O(1)随机访问,尾部插入/删除无扩容时效率为O(1),头部/中间插入/删除因需移动元素效率为O(n);核心函数需注意易混点:无pop()/top()/bottom()(这是stack的函数),正确操作包括push_back(元素)(尾部插入)、emplace_back(参数)(C++11新增,直接在尾部构造元素,自定义类型比push_back更高效)、pop_back()(尾部删除,无返回值),访问元素可用[]下标(无越界检查,刷题常用)、at(下标)(有越界检查,刷题少用)、front()(首元素)、back()(尾元素)、data()(返回底层数组指针);容量控制相关函数有size()(已存元素数)、capacity()(当前内存容量)、reserve(n)(提前预留n个元素的内存空间,刷题时预估元素数量后调用可避免频繁扩容,大幅提升push_back效率)、resize(n, 初始值)(调整元素数量,超出部分填充初始值)、clear()(清空元素,不释放内存,容量不变);效率优化技巧(适配LeetCode):① 刷题时预估结果长度先调用reserve(n),从根源避免扩容带来的元素拷贝开销;② 存储自定义类型(如结构体、字符串)时优先用emplace_back替代push_back,减少拷贝/移动开销;③ 遍历大vector时提前缓存size()结果(如int n = vec.size()),避免循环中重复调用;④ 避免不必要的clear()后重新push_back,clear()仅清空元素不释放内存,如需释放内存可使用vector().swap(vec);⑤ 随机访问优先用下标[],比迭代器遍历略高效;初始化技巧:可直接vector vec(n, 0)(初始化n个值为0的元素)、vector vec(arr, arr + sizeof(arr)/sizeof(int))(从数组初始化)、vector vec2 = std::move(vec)(移动语义,无拷贝,效率极高)。

2.cmath:就是数学库,提供各种数学函数啥的,比如abs(),pow()等等

3.string:C++的string(头文件<string>)是STL中管理字符串的核心容器,底层基于动态字符数组实现,核心特性为支持动态扩容、自动管理内存(无需手动释放)、O(1)随机访问,且兼容C风格字符串(可通过c_str()/data()转换为const char*),能避免手动处理字符数组的越界/内存泄漏问题;核心操作覆盖刷题/内核开发高频场景:初始化支持string s1(空串)、string s2("abc")(字面量)、string s3(5, 'a')(重复字符)、string s4 = s2.substr(1,2)(截取子串,索引1开始、长度2);拼接/追加用s1 += "def"(尾部追加,效率高)、s1.append("ghi")(批量追加);修改可通过[]下标直接赋值(如s[0] = 'A',无越界检查)或at(0)(有越界检查,刷题少用);查找/替换用s.find("bc")(返回首次匹配的索引,无匹配则返回string::npos)、s.replace(1,2,"xy")(从索引1开始替换2个字符为"xy");比较支持直接用==/!=/>/<(按ASCII码逐字符比较),也可调用compare()函数;其他实用操作包括size()/length()(获取长度,等价)、empty()(判断空串)、erase(1,2)(删除索引1开始的2个字符)、insert(1, "mn")(在索引1插入"mn");关键避坑点:① substr(pos, len)pos不能越界,len超出剩余长度则截取到串尾;② 查找操作需判断返回值是否为string::npos(而非-1,因其是无符号类型);③ 拼接大量字符串时,优先用+=而非多次+(减少临时对象拷贝),内核开发中处理协议包/SQL语句时,可提前用reserve()预留空间提升效率;④ 转换C风格字符串时,c_str()/data()返回的const char*仅在string未修改前有效,修改string后指针可能失效。

4.algorithm:C++的<algorithm>头文件是STL核心算法库,封装了数百种通用的容器操作算法,无需手动实现排序、查找、遍历、修改等基础逻辑,适配vector、string、array等所有支持迭代器的容器,是刷题/内核开发中提升效率的关键工具;核心特性为算法与容器解耦(通过迭代器操作)、支持自定义谓词(lambda/函数指针),所有算法均基于模板实现,适配不同数据类型;高频实用算法(贴合刷题/开发场景):① 排序类:sort(vec.begin(), vec.end())(快速排序,默认升序,可传lambda自定义规则如sort(vec.begin(), vec.end(), greater<int>())降序)、stable_sort(稳定排序,保留相等元素相对位置);② 查找类:find(vec.begin(), vec.end(), 5)(查找元素5,返回迭代器,未找到则返回end())、binary_search(vec.begin(), vec.end(), 5)(二分查找,要求容器已排序,返回bool)、lower_bound/upper_bound(有序容器中找首个≥/>目标值的迭代器,刷题找边界高频);③ 遍历/修改类:for_each(vec.begin(), vec.end(), [](int x){cout<<x;})(遍历执行自定义操作)、transform(vec1.begin(), vec1.end(), vec2.begin(), [](int x){return x*2;})(将vec1元素转换后存入vec2)、replace(vec.begin(), vec.end(), 5, 0)(将所有5替换为0);④ 集合操作类:unique(vec.begin(), vec.end())(去重,需先排序,返回去重后尾迭代器)、merge(v1.begin(),v1.end(),v2.begin(),v2.end(),res.begin())(合并两个有序容器到res)、reverse(vec.begin(), vec.end())(反转容器元素);⑤ 最值/计数类:max_element/min_element(返回最大/最小元素迭代器)、count(vec.begin(), vec.end(), 5)(统计元素5出现次数);关键避坑点:① 二分查找类算法(binary_search/lower_bound)仅对已排序容器有效,否则结果不可靠;② unique仅“移除”连续重复元素,需配合erase删除尾部无效元素(如vec.erase(unique(vec.begin(),vec.end()), vec.end()));③ 算法操作的是迭代器,不会自动扩容容器(如merge前需确保res有足够空间);④ 自定义谓词需保证逻辑一致(如sort的比较函数需满足严格弱序),否则可能触发未定义行为。

5.unordered_map 是 C++ 中基于哈希表实现的无序键值对容器,可理解为 “无排序的字典”:键(key)唯一、值(value)可重复,通过键能以平均 O (1) 的极快速度查找 / 插入 / 删除值,这是它相比红黑树实现的有序 map 最核心的优势;但它内部元素无序、内存占用更高,且键需支持哈希函数与判等操作;常用场景包括快速统计元素频率、键值快速映射(如学号 - 姓名)、无顺序要求的缓存 / 字典等,核心用法有[]赋值、find()查找(避免键不存在时自动插入)、erase()删除、遍历键值对等。

6.set:就是集合,不怎么常用啊

7.stack(栈):是 C++ 中遵循 “先进后出(FILO)” 规则的适配器容器,可理解为 “竖直的弹夹 / 装盘桶”,仅能对栈顶进行操作;核心常用函数并非push_back(该函数属于 vector/deque),正确的是push()(向栈顶添加元素)、pop()(删除栈顶元素,无返回值)、top()(获取栈顶元素,需先判空避免越界),此外还有empty()(判断栈是否为空)、size()(获取栈内元素个数);它常用于括号匹配、逆序处理、深度优先搜索(DFS)、表达式求值等场景,使用时需注意调用top()/pop()前务必用empty()检查栈是否为空,防止访问空栈报错。

8.atomic(原子库):是 C++ 用于并行 / 多线程编程的核心工具,可理解为 “不可被打断的操作”:针对变量的读、写、自增 / 自减等操作能一次性完成,不会被其他线程干扰,相比传统加锁(如 mutex)更轻量、效率更高;它解决了多线程对共享变量操作时的 “数据竞争” 问题(比如多个线程同时修改一个计数器导致结果错误),常用用法如atomic cnt(0); cnt++(原子自增)、cnt.load()(原子读)、cnt.store(5)(原子写);适用场景为多线程下简单的共享变量操作(如计数器、标志位),复杂场景仍需搭配锁使用,核心优势是无锁开销、避免死锁风险,且操作保证 “原子性” 不会被中断。

9.thread :是 C++11 及以上标准提供的线程库,是创建和管理线程的核心工具,可直接在代码中开启多线程并行执行任务;核心用法为std::thread 线程名(函数名, 函数参数)(创建线程并立即执行),需注意调用join()(等待线程执行完毕,主线程阻塞)或detach()(分离线程,主线程不等待,线程后台运行),否则程序会崩溃;常用配套操作有joinable()(判断线程是否可等待)、get_id()(获取线程 ID),多线程共享数据时需配合mutex(互斥锁)或atomic(原子操作)避免数据竞争;使用时需包含头文件,核心优势是原生支持跨平台,无需依赖第三方库,是 C++ 并行编程的基础。

10.mutex(互斥锁):是 C++ 多线程编程中解决 “数据竞争” 的核心工具,可理解为 “共享资源的一把锁”:当一个线程访问共享变量 / 资源时,调用lock()上锁,其他线程会被阻塞直到该线程调用unlock()解锁,保证同一时间只有一个线程能操作共享资源;推荐搭配std::lock_guard(自动上锁 / 解锁,避免忘记 unlock 导致死锁)或std::unique_lock(更灵活的锁管理)使用,需包含头文件;核心适用场景是多线程读写共享数据(如全局变量、共享容器),但需注意避免锁粒度过大(影响效率)或嵌套锁(易引发死锁),是保障多线程数据安全的基础手段。

11.regex:正则表达式,很常用,用来处理数据或者查询字符的

12.format:是 C++20 引入的新一代字符串格式化工具,可理解为 “更强大、更安全的 printf 升级版”:支持类似 Python f-string 的占位符语法(如std::format("姓名:{},年龄:{}", name, age)),能自动匹配变量类型,避免 printf 的格式符与类型不匹配问题;支持位置参数({1} {0})、格式控制(如保留 2 位小数{:.2f}),且类型安全、可读性远高于拼接字符串或 sprintf;需包含头文件(部分编译器需开启 C++20 支持);核心优势是兼顾易用性与安全性,相比传统方式,既避免了字符串拼接的繁琐,又解决了 printf 的类型错误风险,是 C++ 中格式化字符串的首选方案

13.iostream :是 C++ 最基础、最常用的输入输出库,核心用于程序与外部设备(如键盘、屏幕)的交互,需包含头文件;其中std::cin(输入流)搭配>>运算符从键盘读取数据(如cin >> num),std::cout(输出流)搭配<<运算符向屏幕输出数据(如cout << "结果:" << num),补充常用操作:endl用于换行并刷新缓冲区(cout << "hello" << endl),cin.get()可读取空格 / 换行等空白字符(解决cin >>跳过空白的问题);核心特点是类型安全(无需像 printf 指定格式)、用法简洁,是 C++ 程序输入输出的基础,需注意区分cin和cout的运算符方向(cin >>是 “数据流入程序”,cout <<是 “数据流出程序”)。

14.variant :是 C++17 引入的类型安全的 “联合体(union)升级版”,可理解为 “能存储多种类型但同一时间仅存一种的容器”:比如variant<int, string, double>可存储整数、字符串或浮点数,但任一时刻只有一个值有效;核心用法包括std::get<类型/索引>()获取值(如get(v))、std::holds_alternative<类型>()判断存储的类型(避免 get 出错)、index()返回当前存储类型的索引;相比传统 union,variant 类型安全(不会因类型错误导致未定义行为)、支持非 POD 类型(如 string),无需手动管理内存;核心适用场景是需要存储 “多种可选类型” 的场景(如配置项值、函数多类型返回值),替代繁琐的类型判断和强制转换。

15.module:就是把一个class封装成一个模块,传统的include头文件效率太差,都是把外部库复制粘贴进来然后编译,占用了很大的空间。

posted @ 2026-01-23 10:29  cyusouyiku  阅读(4)  评论(0)    收藏  举报