栈#include stack using namespace std; stackint st; // 定义一个存储 int 类型的栈 st.push(5); // 入栈将元素 5 压入栈顶 int a st.top(); // 取栈顶元素不删除 st.pop(); // 弹出栈顶元素无返回值 bool is_empty st.empty(); // 判断栈是否为空 int size st.size(); // 获取栈中元素个数 stackTreeNode* st;队列#include queue using namespace std; queueint 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(); // 获取队列中元素个数 queueTreeNode* que;字典std::map/std::unordered_map#include map // 有序字典 #include unordered_map // 无序字典哈希表等价Python dict using namespace std; // 1. 定义字典键类型为string值类型为int unordered_mapstring, 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按键升序排列 mapstring, int ordered_dict; ordered_dict[王五] 75; ordered_dict[赵六] 80; // 遍历时会自动按key升序输出王五:75 → 赵六:80操作 / 功能语法示例说明头文件#include map必须包含定义mapKey, Val mp;Key 键类型如 stringVal 值类型如 int按键升序排列插入键值对mp[key] val;键不存在则插入存在则覆盖值mp.insert({key, val});键已存在时不会覆盖返回插入结果mp.emplace(key, val);原地构造效率比 insert 高访问值mp[key]按键取值键不存在则自动插入值为默认值int0stringmp.at(key)按键取值键不存在则抛出异常更安全查找键mp.find(key)返回迭代器找到则指向该键值对否则 mp.end ()mp.count(key)存在返回 1不存在返回 0map 键唯一删除元素mp.erase(key)按键删除返回删除的元素个数0 或 1mp.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_mapKey, Val ump;键值对无序底层哈希表平均 O (1) 操作等价 Python dict核心操作同 mapinsert/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存储两个不同类型的值 pairint, string p1; // 默认初始化 pairint, 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 stackpairTreeNode*, int st; // 栈中存储「节点指针路径和」 st.push(make_pair(root, root-val)); auto top st.top(); TreeNode* node top.first; // 取节点 int cur_sum top.second; // 取路径和 // 5. pair作为函数返回值返回多个值 pairint, int get_min_max(vectorint 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); // C17结构化绑定pairint, string p(10, hello); cout p.first; // 输出 10 cout p.second; // 输出 hello p.first 20; // 修改第一个值为20 p.second world;// 修改第二个值为world// 定义栈存储“TreeNode* 类型的节点指针”和“int 类型的路径和” stackpairTreeNode*, int st; // 创建一个pair对象第一个值是root节点指针第二个值是root-val路径和 st.push(pairTreeNode*, int(root, root-val)); // 取出栈顶的pair访问其成员 pairTreeNode*, int node st.top(); node.first; // 等价于 节点指针比如 root node.second; // 等价于 路径和比如 root-val操作 / 功能语法示例说明头文件#include utility必须包含否则无法使用 pair定义 / 初始化pairT1, T2 p;定义空 pairT1/T2 为任意类型如 int/string/TreeNode*pairT1, T2 p(v1, v2);直接初始化p.firstv1p.secondv2auto p make_pair(v1, v2);简化初始化自动推导类型推荐访问元素p.first获取第一个元素只读 / 可修改p.second获取第二个元素只读 / 可修改修改元素p.first new_val;直接赋值修改第一个元素p.second new_val;直接赋值修改第二个元素作为容器元素stackpairTreeNode*, int st;栈中存储「节点指针 路径和」路径总和题用法st.push(make_pair(node, sum));入栈 pair 元素作为函数返回值pairint, int func() { return {a,b}; }函数返回两个值如返回最小 / 最大值解构访问C17auto [a, b] func();结构化绑定直接拆分 pair 为两个变量无需写 first/secondauto 关键字核心作用C11 自动类型推导关键字仅用于「变量声明 初始化」让编译器根据初始化值推导变量类型语法糖不改变逻辑 / 性能。// 推导栈顶元素类型代替 pairTreeNode*,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对象无需手动写pairT1,T2返回值可直接作为push参数。// 繁琐写法显式构造 st.push(pairTreeNode*,int(root, root-val)); // 简化写法推荐 st.push(make_pair(root, root-val));本质等价于pairT1,T2(a,b)只是自动推导 T1/T2 类型减少代码量auto 不能替代 make_pairauto 是 “类型推导工具”make_pair 是 “pair 对象构造工具”push 需要的是 “对象”因此必须用 make_pair或显式构造生成对象auto 仅简化变量声明。栈 / 队列定义规则空容器必须显式声明类型如stackpairTreeNode*,int st;无法用 auto 推导只有初始化赋值的容器C17可推导auto st stackint{1,2,3};。空指针规范C 中用NULL或nullptr推荐避免用nullJava 语法。关键字 / 函数本质作用能否直接用于 push 参数举例auto推导已存在的变量的类型仅声明时用❌ 不能无法构造对象auto p st.top();推导 p 的类型make_pair构造并返回一个pair对象生成新对象✅ 能返回的对象符合 push 要求st.push(make_pair(a, b));✅ 不用make_pair也可以但必须显式构造pair对象不能省略 “构造对象” 这一步✅auto仅用于推导已存在变量的类型绝对不能直接作为函数参数比如st.push(auto(...))是语法错误。
c++一些刷题笔记,结构
栈#include stack using namespace std; stackint st; // 定义一个存储 int 类型的栈 st.push(5); // 入栈将元素 5 压入栈顶 int a st.top(); // 取栈顶元素不删除 st.pop(); // 弹出栈顶元素无返回值 bool is_empty st.empty(); // 判断栈是否为空 int size st.size(); // 获取栈中元素个数 stackTreeNode* st;队列#include queue using namespace std; queueint 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(); // 获取队列中元素个数 queueTreeNode* que;字典std::map/std::unordered_map#include map // 有序字典 #include unordered_map // 无序字典哈希表等价Python dict using namespace std; // 1. 定义字典键类型为string值类型为int unordered_mapstring, 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按键升序排列 mapstring, int ordered_dict; ordered_dict[王五] 75; ordered_dict[赵六] 80; // 遍历时会自动按key升序输出王五:75 → 赵六:80操作 / 功能语法示例说明头文件#include map必须包含定义mapKey, Val mp;Key 键类型如 stringVal 值类型如 int按键升序排列插入键值对mp[key] val;键不存在则插入存在则覆盖值mp.insert({key, val});键已存在时不会覆盖返回插入结果mp.emplace(key, val);原地构造效率比 insert 高访问值mp[key]按键取值键不存在则自动插入值为默认值int0stringmp.at(key)按键取值键不存在则抛出异常更安全查找键mp.find(key)返回迭代器找到则指向该键值对否则 mp.end ()mp.count(key)存在返回 1不存在返回 0map 键唯一删除元素mp.erase(key)按键删除返回删除的元素个数0 或 1mp.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_mapKey, Val ump;键值对无序底层哈希表平均 O (1) 操作等价 Python dict核心操作同 mapinsert/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存储两个不同类型的值 pairint, string p1; // 默认初始化 pairint, 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 stackpairTreeNode*, int st; // 栈中存储「节点指针路径和」 st.push(make_pair(root, root-val)); auto top st.top(); TreeNode* node top.first; // 取节点 int cur_sum top.second; // 取路径和 // 5. pair作为函数返回值返回多个值 pairint, int get_min_max(vectorint 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); // C17结构化绑定pairint, string p(10, hello); cout p.first; // 输出 10 cout p.second; // 输出 hello p.first 20; // 修改第一个值为20 p.second world;// 修改第二个值为world// 定义栈存储“TreeNode* 类型的节点指针”和“int 类型的路径和” stackpairTreeNode*, int st; // 创建一个pair对象第一个值是root节点指针第二个值是root-val路径和 st.push(pairTreeNode*, int(root, root-val)); // 取出栈顶的pair访问其成员 pairTreeNode*, int node st.top(); node.first; // 等价于 节点指针比如 root node.second; // 等价于 路径和比如 root-val操作 / 功能语法示例说明头文件#include utility必须包含否则无法使用 pair定义 / 初始化pairT1, T2 p;定义空 pairT1/T2 为任意类型如 int/string/TreeNode*pairT1, T2 p(v1, v2);直接初始化p.firstv1p.secondv2auto p make_pair(v1, v2);简化初始化自动推导类型推荐访问元素p.first获取第一个元素只读 / 可修改p.second获取第二个元素只读 / 可修改修改元素p.first new_val;直接赋值修改第一个元素p.second new_val;直接赋值修改第二个元素作为容器元素stackpairTreeNode*, int st;栈中存储「节点指针 路径和」路径总和题用法st.push(make_pair(node, sum));入栈 pair 元素作为函数返回值pairint, int func() { return {a,b}; }函数返回两个值如返回最小 / 最大值解构访问C17auto [a, b] func();结构化绑定直接拆分 pair 为两个变量无需写 first/secondauto 关键字核心作用C11 自动类型推导关键字仅用于「变量声明 初始化」让编译器根据初始化值推导变量类型语法糖不改变逻辑 / 性能。// 推导栈顶元素类型代替 pairTreeNode*,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对象无需手动写pairT1,T2返回值可直接作为push参数。// 繁琐写法显式构造 st.push(pairTreeNode*,int(root, root-val)); // 简化写法推荐 st.push(make_pair(root, root-val));本质等价于pairT1,T2(a,b)只是自动推导 T1/T2 类型减少代码量auto 不能替代 make_pairauto 是 “类型推导工具”make_pair 是 “pair 对象构造工具”push 需要的是 “对象”因此必须用 make_pair或显式构造生成对象auto 仅简化变量声明。栈 / 队列定义规则空容器必须显式声明类型如stackpairTreeNode*,int st;无法用 auto 推导只有初始化赋值的容器C17可推导auto st stackint{1,2,3};。空指针规范C 中用NULL或nullptr推荐避免用nullJava 语法。关键字 / 函数本质作用能否直接用于 push 参数举例auto推导已存在的变量的类型仅声明时用❌ 不能无法构造对象auto p st.top();推导 p 的类型make_pair构造并返回一个pair对象生成新对象✅ 能返回的对象符合 push 要求st.push(make_pair(a, b));✅ 不用make_pair也可以但必须显式构造pair对象不能省略 “构造对象” 这一步✅auto仅用于推导已存在变量的类型绝对不能直接作为函数参数比如st.push(auto(...))是语法错误。