当前位置: 首页 > news >正文

c++一些刷题笔记,结构

#include <stack> using namespace std; stack<int> st; // 定义一个存储 int 类型的栈 st.push(5); // 入栈:将元素 5 压入栈顶 int a = st.top(); // 取栈顶元素(不删除) st.pop(); // 弹出栈顶元素(无返回值) bool is_empty = st.empty(); // 判断栈是否为空 int size = st.size(); // 获取栈中元素个数 stack<TreeNode*> st;

队列

#include <queue> using namespace std; queue<int> q; // 定义一个存储 int 类型的队列 q.push(10); // 入队:将元素 10 加入队尾 int b = q.front(); // 取队首元素(不删除) int c = q.back(); // 取队尾元素(不删除) q.pop(); // 弹出队首元素(无返回值) bool is_empty = q.empty(); // 判断队列是否为空 int size = q.size(); // 获取队列中元素个数 queue<TreeNode*> que;

字典(std::map/std::unordered_map

#include <map> // 有序字典 #include <unordered_map> // 无序字典(哈希表,等价Python dict) using namespace std; // 1. 定义字典:键类型为string,值类型为int unordered_map<string, int> dict; // 2. 插入/修改键值对 dict["张三"] = 90; // 若键不存在则插入,存在则覆盖值 dict.insert({"李四", 85}); // 插入方式2 // 3. 访问元素 int score = dict["张三"]; // 按键取值,若键不存在会自动插入默认值0 int score2 = dict.at("李四"); // 按键取值,若键不存在会抛出异常 // 4. 查找键是否存在 auto it = dict.find("张三"); if (it != dict.end()) { cout << "存在,值为:" << it->second << endl; } else { cout << "不存在" << endl; } // 5. 删除元素 dict.erase("张三"); // 按键删除 dict.clear(); // 清空所有元素 // 6. 遍历字典 for (auto& pair : dict) { cout << pair.first << ": " << pair.second << endl; // pair.first=键,pair.second=值 } // 7. 判断是否为空 & 获取元素个数 bool is_empty = dict.empty(); int size = dict.size(); // 有序字典map(按键升序排列) map<string, int> ordered_dict; ordered_dict["王五"] = 75; ordered_dict["赵六"] = 80; // 遍历时会自动按key升序输出:王五:75 → 赵六:80
操作 / 功能语法示例说明
头文件#include <map>必须包含
定义map<Key, Val> mp;Key = 键类型(如 string),Val = 值类型(如 int),按键升序排列
插入键值对mp[key] = val;键不存在则插入,存在则覆盖值
mp.insert({key, val});键已存在时不会覆盖,返回插入结果
mp.emplace(key, val);原地构造,效率比 insert 高
访问值mp[key]按键取值,键不存在则自动插入,值为默认值(int=0,string="")
mp.at(key)按键取值,键不存在则抛出异常(更安全)
查找键mp.find(key)返回迭代器:找到则指向该键值对,否则 = mp.end ()
mp.count(key)存在返回 1,不存在返回 0(map 键唯一)
删除元素mp.erase(key)按键删除,返回删除的元素个数(0 或 1)
mp.erase(iterator)按迭代器删除(如 mp.erase (mp.find (key)))
mp.clear()清空所有元素
遍历for (auto& p : mp) { p.first; p.second; }按升序遍历所有键值对,p.first = 键,p.second = 值
获取大小 / 判空mp.size()返回键值对数量
mp.empty()空返回 true,否则 false
边界操作mp.begin()/mp.end()首 / 尾迭代器
mp.lower_bound(key)返回第一个≥key 的迭代器
mp.upper_bound(key)返回第一个 > key 的迭代器
操作 / 功能语法示例说明
头文件#include <unordered_map>必须包含
定义unordered_map<Key, Val> ump;键值对无序,底层哈希表,平均 O (1) 操作(等价 Python dict)
核心操作同 map(insert/emplace/erase/clear/size/empty/find/count)语法完全一致,仅无序无 lower_bound/upper_bound
区别于 map1. 无序;2. 不支持范围查找;3. 效率更高(平均 O (1))刷题优先用 unordered_map(除非需要有序)
性能注意键需支持哈希(如 int/string),自定义类型需重载哈希函数避免用复杂类型作为键(如 TreeNode * 需谨慎)

pair对

#include <utility> // pair 所在头文件 using namespace std; // 1. 定义pair:存储两个不同类型的值 pair<int, string> p1; // 默认初始化 pair<int, string> p2(10, "hello"); // 直接初始化 auto p3 = make_pair(20, "world"); // 简化创建方式(自动推导类型) // 2. 访问pair成员 int num = p2.first; // 访问第一个元素(10) string str = p2.second; // 访问第二个元素("hello") // 3. 修改pair成员 p3.first = 25; p3.second = "leetcode"; // 4. pair作为容器元素(如栈、队列、map) stack<pair<TreeNode*, int>> st; // 栈中存储「节点指针+路径和」 st.push(make_pair(root, root->val)); auto top = st.top(); TreeNode* node = top.first; // 取节点 int cur_sum = top.second; // 取路径和 // 5. pair作为函数返回值(返回多个值) pair<int, int> get_min_max(vector<int>& nums) { int min_val = *min_element(nums.begin(), nums.end()); int max_val = *max_element(nums.begin(), nums.end()); return {min_val, max_val}; // 返回pair } // 接收返回值 auto [min_num, max_num] = get_min_max(nums); // C++17结构化绑定
pair<int, string> p(10, "hello"); cout << p.first; // 输出 10 cout << p.second; // 输出 hello p.first = 20; // 修改第一个值为20 p.second = "world";// 修改第二个值为world
// 定义栈:存储“TreeNode* 类型的节点指针”和“int 类型的路径和” stack<pair<TreeNode*, int>> st; // 创建一个pair对象,第一个值是root(节点指针),第二个值是root->val(路径和) st.push(pair<TreeNode*, int>(root, root->val)); // 取出栈顶的pair,访问其成员 pair<TreeNode*, int> node = st.top(); node.first; // 等价于 节点指针(比如 root) node.second; // 等价于 路径和(比如 root->val)
操作 / 功能语法示例说明
头文件#include <utility>必须包含,否则无法使用 pair
定义 / 初始化pair<T1, T2> p;定义空 pair,T1/T2 为任意类型(如 int/string/TreeNode*)
pair<T1, T2> p(v1, v2);直接初始化,p.first=v1,p.second=v2
auto p = make_pair(v1, v2);简化初始化(自动推导类型,推荐)
访问元素p.first获取第一个元素(只读 / 可修改)
p.second获取第二个元素(只读 / 可修改)
修改元素p.first = new_val;直接赋值修改第一个元素
p.second = new_val;直接赋值修改第二个元素
作为容器元素stack<pair<TreeNode*, int>> st;栈中存储「节点指针 + 路径和」(路径总和题用法)
st.push(make_pair(node, sum));入栈 pair 元素
作为函数返回值pair<int, int> func() { return {a,b}; }函数返回两个值(如返回最小 / 最大值)
解构访问(C++17+)auto [a, b] = func();结构化绑定,直接拆分 pair 为两个变量(无需写 first/second)

auto 关键字

  • 核心作用:C++11+ 自动类型推导关键字,仅用于「变量声明 + 初始化」,让编译器根据初始化值推导变量类型(语法糖,不改变逻辑 / 性能)。
  • // 推导栈顶元素类型(代替 pair<TreeNode*,int> cur) auto cur = st.top(); // 推导基础类型/迭代器 auto num = 10; // int auto it = mp.begin(); // 哈希表迭代器
  • 非法场景
    • 无初始化声明:auto cur;(❌ 编译器无法推导);
    • 直接用于函数参数 / 表达式:st.push(auto(a,b));(❌ auto 不能构造对象)。

make_pair 函数

  • 核心作用:模板函数,自动接收两个参数并构造pair对象(无需手动写pair<T1,T2>),返回值可直接作为push参数。
  • // 繁琐写法(显式构造) st.push(pair<TreeNode*,int>(root, root->val)); // 简化写法(推荐) st.push(make_pair(root, root->val));
  • 本质:等价于pair<T1,T2>(a,b),只是自动推导 T1/T2 类型,减少代码量
  • auto 不能替代 make_pair:auto 是 “类型推导工具”,make_pair 是 “pair 对象构造工具”,push 需要的是 “对象”,因此必须用 make_pair(或显式构造)生成对象,auto 仅简化变量声明。
  • 栈 / 队列定义规则:空容器必须显式声明类型(如stack<pair<TreeNode*,int>> st;),无法用 auto 推导;只有初始化赋值的容器(C++17+)可推导:auto st = stack<int>{1,2,3};
  • 空指针规范:C++ 中用NULLnullptr(推荐),避免用null(Java 语法)。
关键字 / 函数本质作用能否直接用于 push 参数?举例
auto推导已存在的变量的类型(仅声明时用)❌ 不能(无法构造对象)auto p = st.top();(推导 p 的类型)
make_pair构造并返回一个pair对象(生成新对象)✅ 能(返回的对象符合 push 要求)st.push(make_pair(a, b));

✅ 不用make_pair也可以,但必须显式构造pair对象(不能省略 “构造对象” 这一步);

auto仅用于推导已存在变量的类型,绝对不能直接作为函数参数(比如st.push(auto(...))是语法错误)。

http://www.jsqmd.com/news/496776/

相关文章:

  • Polkadot 验证人节点升级实战 | 备用节点切换、会话密钥交接零宕机完整教程
  • 小学子讲技术 - OpenClaw 沙箱集成详解
  • 操作系统红蓝对抗:从页表到调度器的血性博弈
  • 小学子讲技术 - OpenClaw 配置与安全详解
  • 2026年云南PC耐力板实力厂商盘点:技术、案例与选择指南 - 2026年企业推荐榜
  • 初识数据结构:排序算法
  • 网络安全学习4
  • 2026被动防护网选型指南:五大厂商技术路线与市场格局深度解析 - 2026年企业推荐榜
  • 文件系统红蓝对抗:从ext4到ZFS的数据持久性战争
  • VirtualLab:Ince高斯模式
  • JetBrains IDEs官宣 实验性 AI 功能:Recap 与 Insights 详解
  • 网络协议红蓝对抗:从TCP重传到QUIC的可靠性战争
  • springboot+vue社区疫情返乡管控系统--毕业论文
  • 宝塔面板下Laravel开发环境的高效配置与调试技巧
  • SpringBoot3接口优化:一行注解搞定字典与关联字段翻译,告别冗余循环
  • 【小程序】✈️一口气用AI肝了50+功能的小程序(已上线)
  • 一次线上事故,我学到了事件驱动架构的5个教训
  • TechWiz LCD 2D应用:单畴IPS仿真
  • leetcode 1409. 查询带键的排列
  • 43| 贴海报
  • 打不开游戏提示缺少D3DCompiler_47.dll文件 分享免费下载
  • 光活化标记试剂 Photobiotin acetate salt,96087-38-6
  • 2026年国内焦磷酸二氢二钠优质直销厂家实力与特点盘点 - 深度智识库
  • 2026年深圳人力资源咨询公司哪家强?靠谱可信赖 覆盖多行业需求 可落地参考 - 深度智识库
  • 国企是否有必要自建即时通讯系统,而不是采购成品?
  • [特殊字符] OpenClaw(小龙虾)CentOS 7 完整安装手册
  • 老码农和你一起学AI系列:语言模型采样方法
  • 成都劳动合同纠纷优质律所推荐指南:成都施工合同纠纷律师事务所/成都物业合同纠纷律师事务所/选择指南 - 优质品牌商家
  • 计院操作系统实验10
  • AI一键图片转3D模型工具TrOSR|离线运行·6G显存即可·附详细图文教程