[c++] STL概括
STL 是 C 标准库的核心包含容器、迭代器、算法、函数对象四大组件。对于 OI 竞赛熟练掌握 STL 可以大幅减少代码量、降低调试难度是提升代码效率和准确率的关键。一、常用容器Container1. 序列容器容器特点常用操作时间复杂度vectorT动态数组支持随机访问push_back(), pop_back(), [], size(), resize()末尾增删 O(1)中间 O(n)dequeT双端队列头尾快速增删push_front(), pop_front(), push_back(), pop_back()头尾 O(1)listT双向链表不支持随机访问push_back(), push_front(), insert(), erase()任意位置 O(1)需迭代器arrayT,N固定大小数组比原生数组安全at(), [], size()O(1)重点掌握vector最常用替代数组和 deque用于滑动窗口等。2. 关联容器基于红黑树自动排序容器特点常用操作时间复杂度setT有序集合元素唯一insert(), erase(), find(), lower_bound(), upper_bound()O(log n)multisetT有序集合允许重复同上O(log n)mapK,V有序映射键唯一[], insert(), find(), erase()O(log n)multimapK,V有序映射键可重复不支持 []其余类似O(log n)重点掌握set去重、有序维护、map键值对如统计频次。3. 无序关联容器基于哈希表平均 O(1)容器特点注意事项unordered_setT无序集合需要提供 hash 函数内置类型已支持unordered_mapK,V无序映射同左常用于 O(1) 查询竞赛建议默认用 map/set除非 TLE 且确认哈希不冲突再换成 unordered_*。4. 容器适配器封装其他容器适配器底层默认容器常用操作特点stackTdequeTpush(), pop(), top(), empty(), size()后进先出queueTdequeTpush(), pop(), front(), back()先进先出priority_queueTvectorTpush(), pop(), top()最大堆默认可自定义比较重点掌握stackDFS 非递归、括号匹配、queueBFS、priority_queueDijkstra、哈夫曼树。二、迭代器Iterator迭代器像指针用于遍历容器中的元素。常用操作cpp复制下载vectorint v {1,2,3};for (auto it v.begin(); it ! v.end(); it) cout *it ; // 正向迭代for (auto it v.rbegin(); it ! v.rend(); it) cout *it ; // 反向迭代• begin() / end()指向首元素和尾后位置• rbegin() / rend()反向迭代器• *it访问元素• it移动到下一个位置迭代器失效重要• vector / deque 在插入、删除时可能导致迭代器失效重新分配内存。• 保险做法插入/删除后重新获取迭代器或使用下标而非迭代器。三、常用算法Algorithmalgorithm 头文件提供了大量通用算法。函数作用示例sort(beg, end, cmp)排序默认升序sort(v.begin(), v.end())reverse(beg, end)反转reverse(s.begin(), s.end())unique(beg, end)去重需先排序auto it unique(v.begin(), v.end()); v.erase(it, v.end());lower_bound(beg, end, val)第一个 ≥ val 的位置有序int p lower_bound(v.begin(), v.end(), x) - v.begin();upper_bound(beg, end, val)第一个 val 的位置同左binary_search(beg, end, val)判断是否存在有序if (binary_search(v.begin(), v.end(), x))max_element(beg, end)最大值迭代器int mx *max_element(v.begin(), v.end());min_element(beg, end)最小值迭代器同左next_permutation(beg, end)下一个排列按字典序常用于全排列枚举重点掌握sort, lower_bound, upper_bound, unique, reverse。四、常用技巧与注意事项1. 初始化cpp复制下载vectorint a(10, 0); // 10个0vectorint b {1,2,3}; // C11 列表初始化setint s {4,5,6};mapstring, int mp {{a,1}, {b,2}};2. 遍历• C11 范围 for只读cpp复制下载for (int x : v) cout x ;• 需要修改元素时用引用cpp复制下载for (int x : v) x * 2;3. 自定义排序cpp复制下载// 降序sort(v.begin(), v.end(), greaterint());// 自定义比较函数bool cmp(int a, int b) { return a b; }sort(v.begin(), v.end(), cmp);// 对结构体排序struct Node { int x, y; };bool cmp(Node a, Node b) { return a.x b.x; }4. 堆priority_queue自定义比较cpp复制下载// 小根堆最小堆priority_queueint, vectorint, greaterint pq;// 自定义类型如按second从小到大auto cmp [](pairint,int a, pairint,int b) { return a.second b.second; };priority_queuepairint,int, vectorpairint,int, decltype(cmp) pq(cmp);5. 常用容器方法速查操作vectorset/mapstack/queue添加元素push_back()insert()push()删除元素pop_back()erase()pop()访问首元素front()*s.begin()top() / front()访问末元素back()*s.rbegin()back()queue是否为空empty()empty()empty()大小size()size()size()清空clear()clear()无重新赋值五、竞赛中的常见陷阱1. vectorbool 是特化不保证连续内存慎用。可改用 vectorchar。2. map[] 会默认构造如果键不存在mp[x] 会插入一个默认值0 或空字符串。需要判断是否存在时用 mp.find(x) ! mp.end()。3. set / map 的迭代器不能加减整数非随机访问只能用 / --。4. priority_queue 的 top() 返回 const 引用不能直接修改。5. STL 算法要求区间左闭右开[begin, end)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2492055.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!