news 2026/4/21 1:46:24

别再背STL语法了!用这5个高频场景代码片段,搞定C++刷题和项目

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再背STL语法了!用这5个高频场景代码片段,搞定C++刷题和项目

别再背STL语法了!用这5个高频场景代码片段,搞定C++刷题和项目

每次打开LeetCode准备刷题,或是开始一个新项目时,你是不是总要先翻出那本厚厚的STL手册?然后花半小时回忆vector怎么删除元素、map如何统计频率?其实真正高效的开发者,手里都有一套经过实战检验的代码模板。下面这5个高频场景的解决方案,能覆盖80%的算法题和项目需求。

1. 高效删除vector中的特定元素

新手常犯的错误是直接遍历删除:

// 错误示范! for(int i=0; i<vec.size(); i++){ if(vec[i] == target) { vec.erase(vec.begin()+i); } }

这会导致迭代器失效和漏删问题。正确的O(n)时间复杂度做法是:

vector<int> vec = {1,3,5,7,3,9}; int target = 3; // 正确写法 vec.erase( remove(vec.begin(), vec.end(), target), vec.end() ); // 或者使用迭代器版本(适用于复杂条件) for(auto it=vec.begin(); it!=vec.end();){ if(*it % 2 == 0){ // 删除所有偶数 it = vec.erase(it); } else { ++it; } }

提示:remove算法实际上是把要保留的元素前移,返回新的逻辑终点,需要配合erase完成物理删除

2. 统计元素频率的三种姿势

根据数据特点选择最优方案:

场景容器选择时间复杂度代码复杂度
数据范围已知且较小数组O(n)★☆☆
需要排序遍历mapO(nlogn)★★☆
只需快速查询unordered_mapO(n)★★☆
// 方案1:数组计数(适合元素值较小的情况) vector<int> nums = {1,3,2,1,5,2}; int count[100] = {0}; // 假设元素不超过100 for(int num : nums) count[num]++; // 方案2:map自动排序(需要有序输出时) map<string, int> wordCount; for(auto& word : words){ wordCount[word]++; // 等价于: // auto it = wordCount.find(word); // if(it != wordCount.end()) it->second++; // else wordCount.insert({word,1}); } // 方案3:哈希表最快查询 unordered_map<char, int> freq; for(char c : s) freq[c]++;

3. Top K问题的优先队列解法

求前K大/小元素时,维护一个大小为K的堆是关键:

// 前K大元素(维护小顶堆) vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int,int> freq; for(int num : nums) freq[num]++; // 定义小顶堆比较函数 auto cmp = [](pair<int,int>& a, pair<int,int>& b){ return a.second > b.second; }; priority_queue<pair<int,int>, vector<pair<int,int>>, decltype(cmp)> pq(cmp); for(auto& [num, count] : freq){ pq.push({num, count}); if(pq.size() > k) pq.pop(); } vector<int> res; while(!pq.empty()){ res.push_back(pq.top().first); pq.pop(); } return res; }

注意:求前K大用小顶堆(淘汰小的),求前K小用大顶堆(淘汰大的)

4. 字符串处理的四件套

字符串问题90%逃不过这四种操作:

  1. 分割getline+stringstream组合
string s = "apple,banana,orange"; stringstream ss(s); string token; while(getline(ss, token, ',')){ cout << token << endl; }
  1. 匹配:KMP算法模板(适合重复匹配)
vector<int> buildNext(string& pattern){ vector<int> next(pattern.size()); for(int i=1, j=0; i<pattern.size(); i++){ while(j>0 && pattern[i]!=pattern[j]) j = next[j-1]; if(pattern[i] == pattern[j]) j++; next[i] = j; } return next; }
  1. 转换transform+lambda表达式
string s = "Hello123"; // 转大写 transform(s.begin(), s.end(), s.begin(), [](char c){ return toupper(c); }); // 过滤非字母 s.erase(remove_if(s.begin(), s.end(), [](char c){ return !isalpha(c); }), s.end());
  1. 解析:正则表达式
#include <regex> string log = "Error: 404 Not Found"; smatch matches; if(regex_search(log, matches, regex("Error: (\\d+)"))){ cout << "错误代码:" << matches[1] << endl; }

5. 自定义排序的六种写法

STL排序的灵活用法能大幅减少代码量:

vector<vector<int>> intervals; vector<pair<int, string>> products; // 1. Lambda表达式(最常用) sort(intervals.begin(), intervals.end(), [](auto& a, auto& b){ return a[1] < b[1]; }); // 2. 预定义比较函数 bool cmp(pair<int,string>& a, pair<int,string>& b){ if(a.first != b.first) return a.first > b.first; return a.second < b.second; } sort(products.begin(), products.end(), cmp); // 3. 重载运算符(适合自定义类型) struct Task{ int priority; string name; bool operator<(const Task& other) const { return priority > other.priority; // 降序 } }; // 4. 使用函数对象 struct CompareByLength{ bool operator()(const string& a, const string& b){ return a.size() < b.size(); } }; vector<string> words; sort(words.begin(), words.end(), CompareByLength()); // 5. 多条件排序(tuple自动比较) vector<tuple<int,int,string>> records; sort(records.begin(), records.end()); // 自动按元组顺序比较 // 6. 逆序排序(简便写法) sort(nums.rbegin(), nums.rend());

实战技巧:容器选择的黄金法则

遇到问题时按照这个决策树选择容器:

  1. 是否需要快速查找?

    • 是 → 选择unordered_set/map(O(1))
    • 否 → 进入2
  2. 是否需要自动排序?

    • 是 → 选择set/map(O(logn))
    • 否 → 进入3
  3. 是否需要随机访问?

    • 是 →vectordeque
    • 否 → 进入4
  4. 是否先进先出?

    • 是 →queue
    • 否 →stack

特殊场景:

  • 需要维护极值:priority_queue
  • 需要双向操作:deque
  • 需要去重+排序:set
  • 字符串处理:string+regex

把这些代码片段保存到你的代码库中,下次遇到类似问题时直接调用。记住,优秀的开发者不是记住所有API,而是知道如何快速找到最适合的解决方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 1:43:49

AI员工:让1个人干10个人的活

大家好&#xff0c;我是银子&#xff0c;一家互联网公司的负责人先算一笔扎心的账&#xff1a;管1000家店&#xff0c;传统模式得招50个运营&#xff0c;月人力成本40万打底。隔壁老李的公司&#xff0c;管同样多的店&#xff0c;只用了15个人。利润从哪来&#xff1f;就从这个…

作者头像 李华
网站建设 2026/4/21 1:38:17

5分钟精通暗黑2存档修改:Web版编辑器完整指南

5分钟精通暗黑2存档修改&#xff1a;Web版编辑器完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2的角色属性不够完美而烦恼吗&#xff1f;想要快速获得心仪的装备却不愿花费数百小时刷怪&#xff1f;d…

作者头像 李华
网站建设 2026/4/21 1:34:16

Kubernetes 如何部署微服务?

作为开发者&#xff0c;我们不断努力使我们的应用程序更具可扩展性、模块化和易于管理。微服务架构通过将大型单体应用程序分解为更小的、独立可部署的服务来帮助我们实现这一目标。而在管理这些服务和扩展它们时&#xff0c;Kubernetes 是首选平台。 在本指南中&#xff0c;我…

作者头像 李华
网站建设 2026/4/21 1:27:48

线程的生命周期

线程的生命周期8-3 线程的8-3 线程的生命周期生命周期

作者头像 李华