)
C STL 常用数据结构与函数整理这份笔记按常见 STL 容器分类整理适合在刷题和复习时快速查阅。1.vector1.1 特点底层是动态数组支持随机访问尾部插入、删除效率高中间插入、删除效率低1.2 常用定义vectorintv;vectorintv(5);// 5 个 0vectorintv(5,10);// 5 个 10vectorintv2(v);// 拷贝vectorintv{1,2,3};1.3 常用函数函数作用v.size()返回元素个数v.empty()判断是否为空v.push_back(x)尾部插入v.pop_back()删除最后一个元素v.back()访问最后一个元素v.front()访问第一个元素v[i]访问下标为i的元素v.at(i)访问下标为i的元素越界会检查v.clear()清空v.begin()首元素迭代器v.end()尾后迭代器v.insert(pos, x)在pos前插入v.erase(pos)删除pos位置元素v.erase(l, r)删除区间[l, r)v.resize(n)调整大小v.reserve(n)预留容量1.4 常见写法vectorintv{3,1,4};v.push_back(10);v.pop_back();for(inti0;i(int)v.size();i){coutv[i] ;}for(intx:v){coutx ;}1.5 常用算法配合sort(v.begin(),v.end());// 升序sort(v.begin(),v.end(),greaterint());// 降序reverse(v.begin(),v.end());// 反转2.deque2.1 特点双端队列头尾都可以高效插入删除支持随机访问常用于单调队列、滑动窗口2.2 常用定义dequeintdq;dequeintdq{1,2,3};2.3 常用函数函数作用dq.push_back(x)尾插dq.push_front(x)头插dq.pop_back()尾删dq.pop_front()头删dq.back()访问队尾dq.front()访问队头dq.size()元素个数dq.empty()是否为空dq.clear()清空dq[i]随机访问2.4 示例dequeintdq;dq.push_back(1);dq.push_front(2);coutdq.front()endl;coutdq.back()endl;2.5 易错点和vector一样访问前要确保非空虽然支持随机访问但一般更常用在队头队尾操作3.stack3.1 特点栈后进先出只能访问栈顶元素默认底层一般是deque3.2 常用定义stackintst;3.3 常用函数函数作用st.push(x)入栈st.pop()出栈st.top()访问栈顶st.size()元素个数st.empty()是否为空3.4 示例stackintst;st.push(10);st.push(20);coutst.top()endl;// 20st.pop();3.5 易错点pop()没有返回值想取出栈顶元素要先top()再pop()4.queue4.1 特点队列先进先出只能访问队头和队尾常用于 BFS4.2 常用定义queueintq;4.3 常用函数函数作用q.push(x)入队q.pop()出队q.front()访问队头q.back()访问队尾q.size()元素个数q.empty()是否为空4.4 示例queueintq;q.push(1);q.push(2);coutq.front()endl;// 1q.pop();4.5 易错点pop()也没有返回值访问front()和back()前要保证队列非空5.priority_queue5.1 特点优先队列本质是堆默认是大根堆不能像普通容器那样遍历5.2 常用定义priority_queueintpq;// 大根堆小根堆写法priority_queueint,vectorint,greaterintpq;5.3 常用函数函数作用pq.push(x)插入元素pq.pop()删除堆顶pq.top()访问堆顶pq.size()元素个数pq.empty()是否为空5.4 示例priority_queueintpq;pq.push(3);pq.push(10);pq.push(5);coutpq.top()endl;// 10pq.pop();5.5 易错点默认是大根堆不是小根堆pop()不返回堆顶元素如果要取最小值记得用greaterint6.set6.1 特点内部元素自动有序元素不重复底层一般是红黑树查找、插入、删除通常是O(log n)6.2 常用定义setints;setints{3,1,2};6.3 常用函数函数作用s.insert(x)插入元素s.erase(x)删除值为x的元素s.find(x)查找元素返回迭代器s.count(x)是否存在结果是0或1s.size()元素个数s.empty()是否为空s.clear()清空s.begin()指向最小元素s.end()尾后迭代器s.lower_bound(x)第一个大于等于x的位置s.upper_bound(x)第一个大于x的位置6.4 示例setints;s.insert(3);s.insert(1);s.insert(3);// 重复元素不会插入if(s.count(1)){coutfoundendl;}for(intx:s){coutx ;}6.5 易错点set中元素不能通过迭代器直接修改元素会自动排序不会保持插入顺序7.unordered_set7.1 特点无序集合元素不重复底层是哈希表平均查找、插入、删除是O(1)7.2 常用定义unordered_setintus;7.3 常用函数函数作用us.insert(x)插入us.erase(x)删除us.find(x)查找us.count(x)判断是否存在us.size()元素个数us.empty()是否为空us.clear()清空7.4 示例unordered_setintus;us.insert(10);us.insert(20);if(us.find(10)!us.end()){coutyesendl;}7.5 易错点元素是无序的最坏情况下复杂度可能退化不能使用lower_bound()、upper_bound()8.map8.1 特点键值对容器按 key 自动升序排列key 不重复底层一般是红黑树8.2 常用定义mapstring,intmp;8.3 常用函数函数作用mp[key]访问或插入 key 对应的值mp.insert({key, value})插入键值对mp.erase(key)删除 keymp.find(key)查找 keymp.count(key)判断 key 是否存在mp.size()元素个数mp.empty()是否为空mp.clear()清空mp.begin()首元素迭代器mp.lower_bound(key)第一个大于等于 key 的位置mp.upper_bound(key)第一个大于 key 的位置8.4 示例mapstring,intmp;mp[alice]95;mp[bob]88;coutmp[alice]endl;for(auto[k,v]:mp){coutk vendl;}8.5 易错点mp[key]如果 key 不存在会自动创建如果只是判断是否存在优先用find()或count()9.unordered_map9.1 特点无序键值对容器key 不重复底层是哈希表平均复杂度接近O(1)9.2 常用定义unordered_mapstring,intump;9.3 常用函数函数作用ump[key]访问或插入ump.insert({key, value})插入ump.erase(key)删除ump.find(key)查找ump.count(key)判断是否存在ump.size()元素个数ump.empty()是否为空ump.clear()清空9.4 示例unordered_mapstring,intump;ump[cat]2;ump[dog]3;if(ump.count(cat)){coutump[cat]endl;}9.5 易错点无序遍历结果不固定ump[key]也会自动创建新 key自定义类型做 key 时通常需要自定义哈希函数10. 常用遍历方式总结10.1 下标遍历适用于vector、dequefor(inti0;i(int)v.size();i){coutv[i] ;}10.2 范围for适用于大多数容器for(intx:v){coutx ;}10.3 迭代器遍历for(autoits.begin();it!s.end();it){cout*it ;}10.4 遍历mapfor(autoitmp.begin();it!mp.end();it){coutit-first it-secondendl;}for(auto[k,v]:mp){coutk vendl;}11. 常见使用场景速记容器适合场景vector最常用存一组数据支持随机访问deque需要双端操作stack括号匹配、单调栈、DFS 辅助queueBFS、层序遍历priority_queue堆、Top K、最值维护set去重 有序unordered_set快速去重、快速查找map统计映射关系且需要有序unordered_map计数、哈希映射、频率统计12. 学 STL 时最值得记住的几点12.1 先记“是否有序”set、map是有序的unordered_set、unordered_map是无序的12.2 先记“是否允许重复”set、unordered_set不允许重复map、unordered_map的 key 不允许重复12.3 先记“是否支持下标”vector、deque支持下标set、map不支持像数组那样按位置访问12.4 先记“默认堆类型”priority_queue默认是大根堆12.5 先记“pop()是否返回值”stack、queue、priority_queue的pop()都没有返回值13. 刷题最常用模板13.1vector排序vectorintv{4,2,5,1};sort(v.begin(),v.end());13.2unordered_map计数unordered_mapint,intcnt;for(intx:nums){cnt[x];}13.3set去重setints(nums.begin(),nums.end());13.4 小根堆priority_queueint,vectorint,greaterintpq;13.5 队列 BFSqueueintq;q.push(start);while(!q.empty()){intxq.front();q.pop();}