C++ STL 容器简介(蓝桥杯适用精简版)

C++的万能头文件是:

#include <bits/stdc++.h>

一、常用 STL 容器

1.vector(动态数组)

#include<iostream>
#include<string>
#include <vector>
#include <algorithm> // 包含排序所需的头文件
using namespace std;int main() {vector<int> v;             // 创建一个空的 vectorv.push_back(1);            // 尾部插入元素 1v.push_back(3);            // 尾部插入元素 3v.push_back(2);            // 尾部插入元素 2v.pop_back();              // 尾部删除一个元素(删除 2)cout << "Size of vector: " << v.size() << endl;  // 输出当前 vector 的大小v[0] = 5;                  // 修改 vector 第一个元素为 5sort(v.begin(), v.end());  // 排序 vector 中的元素cout << "Sorted vector: ";for (int num : v) {cout << num << " ";     // 输出排序后的 vector 元素}cout << endl;return 0;
}

2.string(字符串)

#include<iostream>
#include<bits/stdc++.h>
using namespace std;int main() {string s = "hello";s += " world!";            // 拼接字符串,s 变成 "hello world!"// 截取子串string sub = s.substr(0, 5);  // 截取 "hello"cout << "Substr (0, 5): " << sub << endl;// 查找子串位置size_t pos = s.find("wo");  // 查找 "wo" 在 s 中的位置if (pos != string::npos) {cout << "Found 'wo' at position: " << pos << endl;  // 输出找到的位置} else {cout << "'wo' not found!" << endl;}// 获取字符串的长度cout << "Length of string: " << s.length() << endl;  // 输出字符串的长度return 0;
}

3.stack(栈)

#include<iostream>
#include<stack>
using namespace std;int main() {// 创建一个整数栈stack<int> st;// 入栈操作st.push(10);  // 将 10 入栈st.push(20);  // 将 20 入栈st.push(30);  // 将 30 入栈// 查看栈顶元素cout << "Top element: " << st.top() << endl;  // 输出栈顶元素 30// 出栈操作st.pop();  // 弹出栈顶元素 30cout << "After pop, top element: " << st.top() << endl;  // 输出新的栈顶元素 20// 再次查看栈顶元素cout << "Top element after another pop: " << st.top() << endl;  // 输出新的栈顶元素 10// 你也可以查看栈是否为空if (st.empty()) {cout << "The stack is empty." << endl;} else {cout << "The stack is not empty." << endl;}return 0;
}


4.queue(队列)

#include <iostream>
#include <queue>
using namespace std;int main() {// 创建一个整数队列queue<int> q;// 入队操作q.push(10);  // 将 10 入队q.push(20);  // 将 20 入队q.push(30);  // 将 30 入队// 查看队首元素cout << "Front element: " << q.front() << endl;  // 输出队首元素 10// 出队操作q.pop();  // 弹出队首元素 10cout << "After pop, front element: " << q.front() << endl;  // 输出新的队首元素 20// 再次查看队首元素q.pop();  // 弹出队首元素 20cout << "After another pop, front element: " << q.front() << endl;  // 输出新的队首元素 30// 检查队列是否为空if (q.empty()) {cout << "The queue is empty." << endl;} else {cout << "The queue is not empty." << endl;}return 0;
}


5.priority_queue(优先队列)

#include <iostream>
#include <queue>
#include <vector>
using namespace std;int main() {// 默认是大根堆priority_queue<int> max_pq;// 插入元素到大根堆max_pq.push(3);max_pq.push(1);max_pq.push(2);cout << "大根堆操作:" << endl;cout << "堆顶元素 (最大元素): " << max_pq.top() << endl; // 输出 3max_pq.pop(); // 移除最大元素 3cout << "移除最大元素后,堆顶元素: " << max_pq.top() << endl; // 输出 2// 创建小根堆priority_queue<int, vector<int>, greater<int>> min_pq;// 插入元素到小根堆min_pq.push(3);min_pq.push(1);min_pq.push(2);cout << "\n小根堆操作:" << endl;cout << "堆顶元素 (最小元素): " << min_pq.top() << endl; // 输出 1min_pq.pop(); // 移除最小元素 1cout << "移除最小元素后,堆顶元素: " << min_pq.top() << endl; // 输出 2return 0;
}


6.set(有序集合)

#include <iostream>
#include <set>
using namespace std;int main() {set<int> s;// 插入元素s.insert(5); // 插入元素 5s.insert(2); // 插入元素 2s.insert(8); // 插入元素 8s.insert(3); // 插入元素 3s.insert(1); // 插入元素 1// 打印集合中的元素cout << "集合中的元素:" << endl;for (auto it = s.begin(); it != s.end(); ++it) {cout << *it << " ";}cout << endl;// 删除元素 5s.erase(5);cout << "删除 5 后的集合:" << endl;for (auto it = s.begin(); it != s.end(); ++it) {cout << *it << " ";}cout << endl;// 检查元素 5 是否存在if (s.count(5) > 0) {cout << "元素 5 存在" << endl;} else {cout << "元素 5 不存在" << endl;  // 这行将被打印}// 查找第一个大于等于 3 的元素auto it = s.lower_bound(3);if (it != s.end()) {cout << "第一个大于等于 3 的元素是: " << *it << endl;  // 输出 3} else {cout << "没有大于等于 3 的元素" << endl;}return 0;
}


7.map(有序键值对)

#include <iostream>
#include <map>
using namespace std;int main() {map<string, int> mp;// 插入键值对mp["apple"] = 5;   // 插入或修改键值对 "apple" -> 5mp["banana"] = 3;  // 插入 "banana" -> 3mp["orange"] = 7;  // 插入 "orange" -> 7// 判断键 "apple" 是否存在if (mp.count("apple") > 0) {cout << "键 'apple' 存在,值为 " << mp["apple"] << endl;} else {cout << "键 'apple' 不存在" << endl;}// 遍历 map 中的所有键值对cout << "map 中的键值对为:" << endl;for (auto& p : mp) {cout << p.first << " -> " << p.second << endl;}return 0;
}


8.pair(组合两个值)

#include <iostream>
#include <utility>  // 包含pair定义
#include <string>   // 包含string定义using namespace std;int main() {// 创建一个pair对象,包含int和string类型pair<int, string> p = {1, "abc"};// 输出pair的第一个值和第二个值cout << p.first << " " << p.second << endl;  // 输出: 1 abcreturn 0;
}


二、蓝桥杯常用代码模板


1.快速排序(直接用 STL)

#include <iostream>
#include <algorithm>  // 包含sort函数
#include <vector>     // 包含vector定义
#include <functional>  // 包含greaterusing namespace std;int main() {// 创建一个包含整数的vectorvector<int> v = {3, 1, 4, 2};// 默认升序排序sort(v.begin(), v.end());cout << "升序排序: ";for (int num : v) {cout << num << " ";  // 输出: 1 2 3 4}cout << endl;// 降序排序sort(v.begin(), v.end(), greater<int>());cout << "降序排序: ";for (int num : v) {cout << num << " ";  // 输出: 4 3 2 1}cout << endl;return 0;
}


2.二分查找

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {// 假设有一个已排序的数组vector<int> v = {1, 2, 4, 6, 8, 10};int target = 5;// 使用 lower_bound 找到第一个 >= target 的位置int pos = lower_bound(v.begin(), v.end(), target) - v.begin();cout << "第一个 >= " << target << " 的位置是: " << pos << endl;return 0;
}

3.DFS

#include <iostream>
#include <vector>using namespace std;vector<vector<int>> graph; // 图的邻接表表示
vector<bool> visited; // 访问标记void dfs(int cur) {visited[cur] = true; // 标记当前节点为已访问cout << "访问节点: " << cur << endl;for (auto next : graph[cur]) { // 遍历所有相邻节点if (!visited[next]) {dfs(next); // 递归访问未访问的邻居}}
}int main() {int n = 5; // 节点数graph.resize(n);visited.resize(n, false);// 示例图: 添加边graph[0].push_back(1);graph[0].push_back(2);graph[1].push_back(3);graph[2].push_back(4);// 从节点 0 开始 DFSdfs(0);return 0;
}


4.BFS 模板

#include <iostream>
#include <vector>
#include <queue>using namespace std;vector<vector<int>> graph; // 图的邻接表表示
vector<bool> visited; // 访问标记void bfs(int start) {queue<int> q;q.push(start);visited[start] = true; // 标记起始节点为已访问while (!q.empty()) {int cur = q.front();q.pop();cout << "访问节点: " << cur << endl;// 遍历所有相邻节点for (auto next : graph[cur]) {if (!visited[next]) {visited[next] = true; // 标记为已访问q.push(next); // 加入队列}}}
}int main() {int n = 5; // 节点数graph.resize(n);visited.resize(n, false);// 示例图: 添加边graph[0].push_back(1);graph[0].push_back(2);graph[1].push_back(3);graph[2].push_back(4);// 从节点 0 开始 BFSbfs(0);return 0;
}


5.并查集

#include <iostream>using namespace std;int parent[1000]; // 并查集父节点数组int find(int x) { if (parent[x] != x) {parent[x] = find(parent[x]); // 路径压缩}return parent[x];
}void unite(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX != rootY) {parent[rootX] = rootY; // 合并集合}
}int main() {int n = 5; // 元素个数// 初始化并查集,每个元素的父节点是自己for (int i = 0; i < n; ++i) {parent[i] = i;}// 合并元素unite(0, 1);unite(1, 2);unite(3, 4);// 检查是否在同一个集合if (find(0) == find(2)) {cout << "0 和 2 在同一个集合" << endl;} else {cout << "0 和 2 不在同一个集合" << endl;}if (find(0) == find(4)) {cout << "0 和 4 在同一个集合" << endl;} else {cout << "0 和 4 不在同一个集合" << endl;}return 0;
}


6.前缀和

#include <iostream>
#include <vector>using namespace std;int main() {int n = 5;vector<int> a = {1, 2, 3, 4, 5}; // 原数组vector<int> s(n + 1, 0); // 前缀和数组// 计算前缀和for (int i = 1; i <= n; i++) {s[i] = s[i - 1] + a[i - 1];}// 查询区间 [l, r] 的和int l = 1, r = 3; // 询问区间 [1, 3]int sum = s[r] - s[l - 1];cout << "区间 [" << l << ", " << r << "] 的和为: " << sum << endl;return 0;
}

三、技巧总结

输入输出加速(写在最开头)

ios::sync_with_stdio(false);
cin.tie(nullptr);


万能头文件(蓝桥杯可用)

#include <bits/stdc++.h>
using namespace std;


结构体排序
 

struct Node {int a, b;bool operator<(const Node& other) const {return a < other.a; // 按a升序}
};
vector<Node> nodes;
sort(nodes.begin(), nodes.end());

建议练习方向:多刷贪心、模拟、动态规划类题目,熟练掌握这些容器的基本操作即可应对大部分蓝桥杯题目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java语言的进化:JDK的未来版本

作为一名Java开发者&#xff0c;我们正处在一个令人兴奋的时代&#xff01;Java语言正在以前所未有的速度进化&#xff0c;每个新版本都带来令人惊喜的特性。让我们一起探索JDK未来版本的发展方向&#xff0c;看看Java将如何继续领跑编程语言界&#xff01;&#x1f4aa; &…

不要使用Round函数保留小数位了

不要使用Round函数保留小数位了 如果你表格不需要保留公式&#xff0c;那么就不要使用Round函数保留小数位了。用Excel工作圈插件&#xff0c;可以轻松以数值形式保留小数位&#xff0c;且支持合并单元格、不连贯区域快速处理。 如下图&#xff0c;有文本&#xff0c;有跨行合并…

【C++】入门基础【下】

目录 一、缺省参数二、函数重载1. 函数类型不同2. 参数个数不同3、函数类型顺序不同 三、引用1、引用的概念和定义2、引用的功能2.1 功能1&#xff1a; 做函数形参&#xff0c;修改形参影响实参2.2 功能2&#xff1a; 做函数形参&#xff0c;减少拷贝&#xff0c;提高效率2.3 功…

git比较不同分支的不同提交文件差异

背景&#xff1a;只想比较某2个分支的某2次提交的差异&#xff0c;不需要带上父提交。 以commitA为基准&#xff0c;用commitB去比较差异 直接上代码&#xff1a; commitAxxxx1 commitBxxxx2 outputFile"output.txt"# 获取与第一个父提交的文件列表 filesA$(git di…

Linux内核之struct pt_regs结构

前沿 项目开发最近进行系统hook功能实现相关业务&#xff0c;主要在centos7和8系列环境开发下关功能。调研了相关知识点&#xff0c;发现在系统7和8上内核版本差别比较大&#xff0c;7-3.10.x系列版本&#xff0c;8-4.18.x系列版本。依据两个系统的内核情况根对应的内核符号表进…

《从混乱到有序:ArkUI项目文件结构改造指南》

在ArkUI开发的广袤天地里&#xff0c;构建一个清晰、有序的文件结构&#xff0c;是打造优质应用的关键。一个合理的文件结构&#xff0c;就像为开发者精心绘制的地图&#xff0c;在项目的各个阶段&#xff0c;都能提供明确的指引&#xff0c;让开发过程顺畅无阻。今天&#xff…

C#基于Sunnyui框架和MVC模式实现用户登录管理

C#基于Sunnyui框架和MVC模式实现用户登录管理 1 Controller1.1 UserManagementController.cs&#xff08;控制器入口&#xff09; 2 Model2.1 UserRepository.cs&#xff08;用户管理模型&#xff09;2.2 User.cs&#xff08;用户结构体&#xff09;2.3 SQLiteHelper.cs&#x…

自然语言处理(NLP)技术的实例

自然语言处理&#xff08;NLP&#xff09;技术在各个领域都有广泛的应用&#xff0c;以下是几个例子&#xff1a; 语音识别&#xff1a;通过NLP技术&#xff0c;计算机可以识别和理解语音指令&#xff0c;例如智能助手如Siri和Alexa就是通过语音识别技术实现与用户的交互。 机…

Spring Boot实战(三十六)编写单元测试

目录 一、什么是单元测试&#xff1f;二、Spring Boot 中的单元测试依赖三、举例 Spring Boot 中不同层次的单元测试3.1 Service层3.2 Controller 层3.3 Repository层 四、Spring Boot 中 Mock、Spy 对象的使用4.1 使用Mock对象的背景4.2 什么是Mock对象&#xff0c;有哪些好处…

aws服务(四)文件存储服务S3 介绍使用代码集成

一、介绍 1、简介 Amazon S3 是 Amazon Web Services 提供的一种对象存储服务(Object Storage),用于在云中存储和检索任意数量的数据。它以高可用性、高扩展性和高持久性著称,非常适合用来存储网站资源、数据备份、日志文件、大数据、机器学习输入输出等。 2、主要特性 …

应用信息1.13.0发布

增加工具箱 增加启动器功能 增加布局查看器 增加手动安装和卸载应用 增加APK文件解析 增加应用多选功能 增加查看应用预装版本 增加应用信息和ADB命令导出 修复其它问题... 百度下载&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234

【Vue3 实战】插槽封装与懒加载

一、为什么需要插槽&#xff1f;从一个面板组件说起 在电商首页开发中&#xff0c;经常遇到这样的场景&#xff1a; 「新鲜好物」「人气推荐」同样类型模块都需要相同的标题栏&#xff0c;但内容区布局不同 这时候&#xff0c;插槽&#xff08;Slot&#xff09;就像一个「内容…

虚无隧穿产生宇宙(true nothing tunneling) 是谁提出的

是 亚历克斯.维连金 英文名&#xff08;alex vilenkin 或者 Alexander Vilenkin)提出来的。 “虚无隧穿产生宇宙”&#xff08;true nothing tunneling&#xff09;这一概念并非一个标准的物理学术语&#xff0c;它更像是对某些现代宇宙学理论的描述&#xff0c;尤其是涉及宇宙…

postgis:添加索引时提示“对访问方法 gist 数据类型 geometry 没有默认的操作符表“

问题 在对gis表的geom字段创建空间索引时&#xff0c;出现“对访问方法 "gist" 数据类型 geometry 没有默认的操作符表”的提示报错。 解决方案 按系列步骤进行排查并解决。 1.先确认已安装postgis -- 查看postgis版本 SELECT postgis_full_version() 若安装了则…

图论---Prim堆优化(稀疏图)

题目通常会提示数据范围&#xff1a; 若 V ≤ 500&#xff0c;两种方法均可&#xff08;朴素Prim更稳&#xff09;。 若 V ≤ 1e5&#xff0c;必须用优先队列Prim vector 存图。 #include <iostream> #include <vector> #include <queue> #include <…

代码随想录算法训练营第一天:数组part1

今日学习的文章链接和视频链接 ● 自己看到题目的第一想法 ● 看完代码随想录之后的想法 ● 自己实现过程中遇到哪些困难 ● 今日收获&#xff0c;记录一下自己的学习时长 状态 思路理解完成 30% 代码debug完成 60% 代码模板总结并抽象出来 100% 题目 704 二分查找 题目链接…

企业为何要求禁用缺省口令?安全风险及应对措施分析

在当今数字化时代&#xff0c;企业网络安全面临着前所未有的挑战。缺省口令的使用是网络安全中的一个重要隐患&#xff0c;许多企业在制定网络安全红线时&#xff0c;明确要求禁用缺省口令。本文将探讨这一要求的原因及其对企业安全的重要性。 引言&#xff1a;一个真实的入侵场…

PostgreSQL 中的权限视图

PostgreSQL 中的权限视图 PostgreSQL 提供了多个系统视图来查询权限信息&#xff0c;虽然不像 Oracle 的 DBA_SYS_PRIVS 那样集中在一个视图中&#xff0c;但可以通过组合以下视图获取完整的系统权限信息。 一 主要权限相关视图 Oracle 视图PostgreSQL 对应视图描述DBA_SYS_…

【防火墙 pfsense】1简介

&#xff08;1&#xff09; pfSense 有以下可能的用途&#xff1a; 边界防火墙 路由器 交换机 无线路由器 / 无线接入点 &#xff08;2&#xff09;边界防火墙 ->要充当边界防火墙&#xff0c;pfSense 系统至少需要两个接口&#xff1a;一个广域网&#xff08;WAN&#xff0…

数据库+Docker+SSH三合一!深度评测HexHub的全栈开发体验

作为一名技术博主&#xff0c;我最近一直被各种开发工具切换搞得焦头烂额。数据库要用Navicat&#xff0c;服务器管理得开Termius&#xff0c;Docker操作还得切到命令行&#xff0c;每天光在不同工具间切换就浪费了大量时间。直到团队里的一位架构师向我推荐了HexHub这个一体化…