您现在的位置是:亿华云 > 应用开发

CPP 做算法题时常用的容器技巧

亿华云2025-10-03 02:52:52【应用开发】1人已围观

简介整理了一下 CPP 做算法题时常用的容器技巧。遇到一门新语言时,我首先都会思考如何实现下属功能。关于算法的笔记放在 GitHub[1] 上。定长数组数组 变长数组vector

整理了一下 CPP 做算法题时常用的算法容器技巧。遇到一门新语言时,常用我首先都会思考如何实现下属功能。器技巧关于算法的算法笔记放在 GitHub[1] 上。

定长数组

数组

变长数组

vector

哈希表

有序字典

优先队列

优先队列重载

排序

排序返回索引

定长数组

要求:

声明与取数

数组

int dx[4] = { 0,常用 1, 0, -1}; int a[N]; dx[0]; 

变长数组

要求:

取值:取头取尾取索引 追加 掐头去尾

vector

vector<int> ans(n);  // 初始长度 n ,默认值为 0 // 取值:取头取尾取索引 ans.front(); ans.back(); ans[i] += 1; // 追加 // 为什么 std::vector 不支持 push_front?器技巧 - Milo Yip的云服务器提供商回答 - 知乎 // https://www.zhihu.com/question/51555037/answer/126373709 ans.push_back(5);  // O(1) // 去尾 ans.pop_back(); 

哈希表

要求:

键值已存在 有序字典 map<int, int> S; // 键值已存在 if (S.count(5))     // S[5] 被定义过 else     // S[5] 未被定义过 

有序字典

map 有序,基于红黑树 unordered_map 无序,算法基于映射,常用效率可能更高

优先队列

要求:

空尺看存弹 重载存储对象 重载比较函数 // 默认是器技巧大根堆 priority_queue<int> heap; // 改为小根堆 priority_queue<int, vetor<int>, greater<int> > min_heap; // 空尺看存弹 heap.empty(); heap.size(); heap.top(); heap.push(5); heap.pop(); 

优先队列重载

// 重载比较函数 struct cmp {      template<typename T, typename U>     bool operator()(T const& left, U const &right) {          if (left.second < right.second) return true;         return false;     } }; int main() {      unordered_map<int, int> mp;     mp[3] = 4;     mp[2] = 44;     mp[12] = 432;     // 重载存储对象 pair<int, int>     priority_queue<pair<int, int>, vector<pair<int, int>>, cmp>  pq(mp.begin(), mp.end());  //完成pq的初始化 } // 版权声明:本文为CSDN博主「leagalhigh」的原创文章,网站模板遵循CC 4.0 BY-SA版权协议,算法转载请附上原文出处链接及本声明。常用 // 原文链接:https://blog.csdn.net/u014257954/article/details/78623215 

排序

要求:

重载排序规则 排序返回索引 vector<int> ans; sort(ans.begin(),器技巧 ans.end());  // 默认从小到大 vector<pair<int, int>> res; sort(res.begin(), res.begin());  // 默认比较第一个元素 

排序返回索引

vector<int> data = { 5, 16, 4, 7};    vector<int> index(data.size(), 0); for (int i = 0 ; i != index.size() ; i++) {      index[i] = i; } sort(index.begin(), index.end(),     [&](const int& a, const int& b) {          return (data[a] < data[b]);     } ); for (int i = 0 ; i != index.size() ; i++) {      cout << index[i] << endl; } // 版权声明:本文为CSDN博主「liangbaqiang」的原创文章,遵循CC 4.0 BY-SA版权协议,算法转载请附上原文出处链接及本声明。常用 // 原文链接:https://blog.csdn.net/qq_36523492/article/details/114122256 

参考资料

[1]算法的服务器托管器技巧笔记: https://github.com/PiperLiu/ACMOI_Journey

很赞哦!(536)