STL 的三大组成部分是?
考点:STL 三大件(A1)。
解析:容器(存数据)、算法(操作数据)、迭代器(连接两者的"指针")。✅ 正确
排除法:B 是数据结构本身;C/D 无关。
关联 · A2 容器分类:三大件里的容器展开。
STL 容器的三大类是?
考点:容器分类(A2)。
解析:序列容器(vector/deque/list)、关联容器(set/map)、无序关联容器(unordered_*)。✅ 正确
排除法:B/C/D 以偏概全。
关联 · A3/A4:序列与关联的特点。
判断题:序列容器(vector/deque/list)按下标顺序存储——vector 随机访问 、头部插入慢;list 任意位置插入 、但不支持随机访问。
考点:序列容器特点(A3)。
解析:vector 随机访问 、头插慢;list 任意位置插入 、无随机访问。✅ 正确
排除法:无(判断题)。混淆点:vector 的尾插均摊 。
关联 · B 组 vector:序列容器的代表。
判断题:set/map 基于红黑树——元素自动按键有序,插入、删除、查找都是 。
考点:关联容器有序性(A4)。
解析:set/map 基于红黑树——自动按键有序,插入删除查找 。✅ 正确
排除法:无(判断题)。混淆点:unordered_* 才用哈希。
关联 · C 组 set/map:关联容器主场。
判断题:stack/queue/priority_queue 是容器适配器——本身不存数据,底层靠别的容器(默认 deque/vector)实现。
考点:容器适配器(A5)。
解析:stack/queue/priority_queue 是适配器——底层靠默认 deque/vector 实现。✅ 正确
排除法:无(判断题)。混淆点:适配器不直接暴露底层。
关联 · D 组:栈队列回顾。
STL 总表是?
考点:总表(A6)。
解析:vector 顺序、set/map 有序、unordered_* 哈希、适配器、算法库 + lambda + bitset。✅ 正确
排除法:B/C/D 以偏概全。
关联 · 本章各板块:总表即目录。
vector 的核心操作是?
考点:vector 回顾(B1)。
解析:push_back/pop_back/size/下标/sort——尾部操作 + 随机访问。✅ 正确
排除法:B 头部操作是 deque/list 的强项;C/D 错。
关联 · I1 代码:{3,1,2} 排序得 1 2 3。
判断题:vector 的 size 是元素个数、capacity 是已分配空间——push_back 超出 capacity 时按倍数(常为 2 倍)扩容并把元素搬过去。
考点:扩容思想(B2)。
解析:size 是元素数、capacity 是已分配空间——超出时按倍数扩容并搬移。✅ 正确
排除法:无(判断题)。混淆点:扩容导致旧迭代器失效(B6)。
关联 · B6 迭代器失效:扩容是失效原因之一。
string 的常用操作是?
考点:string 操作(B3)。
解析:substr/find/+ 拼接/== 比较内容/length 求长。✅ 正确
排除法:B/C/D 错——string 功能很全。
关联 · I2 代码:substr(1,3)="bcd"。
判断题:s.find(x) 找不到时返回 string::npos(一个很大的 size_t 值)——判断要写 != string::npos 而不是 != -1 的整数比较习惯。
考点:find 与 npos(B4)。
解析:find 找不到返回 string::npos(size_t 大值),判断用 != string::npos。✅ 正确
排除法:无(判断题)。混淆点:npos 不是普通 -1 的 int 语义。
关联 · I3 代码:find("na")=2、find("xyz")==npos。
判断题:stoi("123") 把字符串转 int、to_string(45) 把数转字符串——两者互为逆操作。
考点:stoi 与 to_string(B5)。
解析:字符串 ↔ 数互转——stoi 转 int、to_string 转字符串。✅ 正确
排除法:无(判断题)。混淆点:stoll/stod 是长整/浮点版。
关联 · I4 代码:124 与 "456"。
判断题:vector 扩容或 erase 后,之前的迭代器会失效——继续使用是未定义行为。
考点:迭代器失效(B6)。
解析:vector 扩容或 erase 后旧迭代器失效——继续用是未定义行为。✅ 正确
排除法:无(判断题)。混淆点:erase 返回值是"下一个元素"的新迭代器。
关联 · P1 代码:失效实证漏删 4。
判断题:vector 比普通数组安全/方便——自动扩容、知道自己的 size、可整体排序赋值,代价是常数略大。
考点:与数组对比(B7)。
解析:vector 自动扩容、知道 size、可整体排序赋值——代价是常数略大。✅ 正确
排除法:无(判断题)。混淆点:下标访问两者同速。
关联 · A3:vector 是"升级版数组"。
set 的特点是?
考点:set 有序去重(C1)。
解析:元素自动升序 + 去重,重复插入无效。✅ 正确
排除法:B/C 无序;D 是 multiset。
关联 · J1 代码:插入 {3,1,2,1,2} 得 1 2 3。
判断题:multiset 允许重复元素——count(x) 返回 x 的出现次数,erase(x) 会删掉所有 x。
考点:multiset(C2)。
解析:允许重复——count(x) 计次数,erase(x) 删所有 x。✅ 正确
排除法:无(判断题)。混淆点:想删一个要用 erase(find(x))。
关联 · J2 代码:count(2)=2、size=5。
map 的特点是?
考点:map 键值对(C3)。
解析:键唯一、按键升序——m[key]=value 写入、m[key] 读取。✅ 正确
排除法:B/C/D 错。
关联 · J3 代码:b/a/c 乱序插入按 a b c 输出。
判断题:for (auto &p : m) 遍历 map 时按键的升序输出——因为底层是红黑树。
考点:遍历顺序(C4)。
解析:for(auto &p : m) 按键升序遍历——红黑树中序即升序。✅ 正确
排除法:无(判断题)。混淆点:unordered_map 才无序。
关联 · C7 unordered:有序无序的对比。
判断题:set/map 用成员函数 s.lower_bound(x) 是 ;用 std::lower_bound(s.begin(), s.end(), x) 则是 ——树结构不能随机访问。
考点:成员 lower_bound(C5)。
解析:成员函数 ;std::lower_bound 在 set 上是 (无随机访问)。✅ 正确
排除法:无(判断题)。混淆点:P5 再考一遍。
关联 · J5 代码:lower_bound(5)=5、lower_bound(6)=7。
判断题:m[key] 访问不存在的键会插入一个默认值(int 为 0)——判断存在要用 count 或 find。
考点:[] 插入语义(C6)。
解析:m[key] 访问不存在的键会插入默认值(int 为 0)——判断存在用 count/find。✅ 正确
排除法:无(判断题)。混淆点:P4 实证 size 变 2。
关联 · P4 代码:误用 [] 检查存在。
判断题:unordered_map 的遍历顺序与插入顺序一致。
考点:unordered 对比(C7)。
解析:unordered_map 遍历顺序与插入顺序无关(哈希桶序)——"与插入顺序一致"是错的。✅ 答案 B(错误)
排除法:无(判断题)。混淆点:unordered 平均 、有序性换速度。
关联 · C4 遍历顺序:有序 vs 无序。
stack 的核心操作是?
考点:stack 回顾(D1)。
解析:push/pop/top——后进先出(LIFO)。✅ 正确
排除法:B 是 queue;C/D 错。
关联 · K1 代码:输出 3 2 1。
判断题:queue 的 push 在队尾、pop 在队头、front 取队头——先进先出(FIFO)。
考点:queue 回顾(D2)。
解析:push 队尾、pop 队头、front 取队头——FIFO。✅ 正确
排除法:无(判断题)。混淆点:取队尾是 back。
关联 · K2 代码:输出 1 2 3。
判断题:priority_queue<int> 默认是小根堆——队首是全局最小值。
考点:默认大根堆(D3)。
解析:priority_queue<int> 默认是大根堆——队首是最大值。"默认小根"是错的。✅ 答案 B(错误)
排除法:无(判断题)。混淆点:sort 默认升序、pq 默认降序——方向感别混。
关联 · K3 代码:输出 3 2 1。
判断题:priority_queue<int, vector<int>, greater<int>> 是小根堆——队首是全局最小值。
考点:greater 小根堆(D4)。
解析:priority_queue<int, vector<int>, greater<int>> 是小根堆——队首最小。✅ 正确
排除法:无(判断题)。混淆点:第三模板参数才换堆序。
关联 · K4 代码:输出 1 2 3。
判断题:优先队列自定义比较器的方向与 sort 相反——a < b 返回 true 意味着 a 排在堆的后面(大根堆)。
考点:自定义比较器方向(D5)。
解析:pq 比较器方向与 sort 相反——a < b 为 true 表示 a 排在后面(大根)。✅ 正确
排除法:无(判断题)。混淆点:K5 实证 a>b → 小根。
关联 · K5 代码:a>b 得小根 1 2 3。
判断题:deque 支持头尾两端 插入删除(push_front/push_back/pop_front/pop_back),也支持随机访问。
考点:deque 双端(D6)。
解析:头尾两端 插入删除 + 随机访问。✅ 正确
排除法:无(判断题)。混淆点:deque 是 stack/queue 的默认底层。
关联 · K6 代码:pop_front 后 1 3。
栈队列选择矩阵是?
考点:选择矩阵(D7)。
解析:LIFO 用 stack、FIFO 用 queue、最值用 priority_queue、两端用 deque。✅ 正确
排除法:B/C/D 一刀切。
关联 · D1~D6:四容器各归其位。
sort(v.begin(), v.end(), [](int a, int b){ return a > b; }) 的效果是?
考点:sort 与 lambda(E1)。
解析:比较器说"a 该排在 b 前面"——a > b 即降序。✅ 正确
排除法:B 升序是默认;C/D 错。
关联 · L1 代码:降序 3 2 1。
判断题:lower_bound(v.begin(), v.end(), x) 返回迭代器(第一个 ≥x 的位置),取下标要减 v.begin(),取元素用 *it。
考点:lower_bound 迭代器(E2)。
解析:返回迭代器——取下标减 begin、取元素解引用。✅ 正确
排除法:无(判断题)。混淆点:返回的不是下标。
关联 · L6 代码:*lower_bound(3) = 3。
判断题:unique 只去掉相邻的重复元素,返回新末尾迭代器——配合 erase 才真正删除,前提是先 sort。
考点:unique 去重(E3)。
解析:只去相邻重复、返回新末尾——配合 erase 才真删,前提先 sort。✅ 正确
排除法:无(判断题)。混淆点:L2 实证 erase 后 size 3。
关联 · L2 代码:1 2 3。
判断题:binary_search(v.begin(), v.end(), x) 返回 bool(是否存在),要求序列已排序,复杂度 。
考点:binary_search(E4)。
解析:返回 bool(是否存在),要求已排序,。✅ 正确
排除法:无(判断题)。混淆点:无序时结果未定义。
关联 · L6 代码:binary_search(3)=1。
判断题:next_permutation 把序列变成字典序下一个排列,返回 false 表示已是最后一个排列。
考点:next_permutation(E5)。
解析:变成字典序下一个排列,返回 false 表示已是最后一个。✅ 正确
排除法:无(判断题)。混淆点:L3 实证 123→132→123。
关联 · L3 代码:next 后 prev 复原。
判断题:min_element/max_element 返回最值的迭代器(取元素要解引用);count(begin, end, x) 返回 x 出现次数。
考点:minmax 与 count(E6)。
解析:min/max_element 返回迭代器(解引用取元素);count 返回次数。✅ 正确
排除法:无(判断题)。混淆点:min_element 返回的是迭代器不是值。
关联 · L4 代码:1 9 2。
lambda 表达式的语法是?
考点:lambda 语法(F1)。
解析:[捕获](参数) -> 返回类型 { 函数体 }——就地匿名函数。✅ 正确
排除法:B 是普通函数;C/D 无关。
关联 · F2 捕获列表:捕获是 lambda 特色。
lambda 的捕获列表 [&] 与 [=] 的含义是?
考点:捕获列表(F2)。
解析:[&] 按引用捕获(可修改外部变量)、[=] 按值捕获(拷贝)。✅ 正确
排除法:B 错;C/D 反了。
关联 · M1 代码:[&x] 两次自增得 7。
判断题:sort 的比较器写 return a <= b; 也行,效果与 < 一样。
考点:严格弱序(F3)。
解析:比较器必须严格弱序(用 <)——写 <= 是未定义行为。"<= 也行"是错的。✅ 答案 B(错误)
排除法:无(判断题)。混淆点:相等元素比较器两方向都返回 false 才对。
关联 · E1 sort 与 lambda:比较器规范。
判断题:函数对象 = 重载了 operator() 的类/结构体实例——像函数一样调用,且能携带状态,常用于自定义比较器。
考点:函数对象(F4)。
解析:重载 operator() 的类/结构体实例——像函数调用且能携带状态。✅ 正确
排除法:无(判断题)。混淆点:K5 的 Cmp 就是函数对象。
关联 · K5 代码:Cmp 函数对象。
判断题:pair<int,int> 存两个值(first/second,自带字典序比较);tuple 可存任意多个值(get<0> 取值)。
考点:pair 与 tuple(F5)。
解析:pair 存两个值(first/second,自带字典序比较);tuple 存任意多个(get<0> 取值)。✅ 正确
排除法:无(判断题)。混淆点:make_pair 与 make_tuple。
关联 · M2 代码:{3,1} > {2,9}。
判断题:自定义排序比较器三种写法等价——lambda、普通函数、函数对象(重载 operator())。
考点:比较器写法(F6)。
解析:lambda、普通函数、函数对象三种写法等价。✅ 正确
排除法:无(判断题)。混淆点:选择最顺手的即可。
关联 · F1/F4:三种载体。
位运算六种操作是?
考点:位运算回顾(G1)。
解析:& 与、| 或、^ 异或、~ 取反、<< 左移、>> 右移。✅ 正确
排除法:B/C/D 不是位运算。
关联 · G2~G4:常用套路。
判断题:lowbit(x) = x & (-x) 取出 x 二进制中最低位的 1 及其后的 0——树状数组的核心。
考点:lowbit(G2)。
解析:x & (-x) 取最低位的 1 及其后的 0——树状数组核心。✅ 正确
排除法:无(判断题)。混淆点:M3 实证 lowbit(12)=4。
关联 · M3 代码:12 & -12 = 4。
判断题:x & (x - 1) 把 x 二进制中最低位的 1 清零——统计 1 的个数(popcount)可反复用此式。
考点:清除最低位 1(G3)。
解析:x & (x-1) 清最低位 1——popcount 反复用它。✅ 正确
排除法:无(判断题)。混淆点:M4 实证 12&11=8。
关联 · M4 代码:12&11=8、popcount(13)=3。
判断题:for (sub = mask; sub; sub = (sub - 1) & mask) 枚举 mask 的全部非空子集(含 mask 本身)。
考点:枚举子集(G4)。
解析:for (sub = mask; sub; sub = (sub-1) & mask) 枚举全部非空子集。✅ 正确
排除法:无(判断题)。混淆点:M5 实证 6 的子集 6 4 2。
关联 · M5 代码:mask=6 → 6 4 2。
bitset 类的特点是?
考点:bitset 类(G5)。
解析:定长二进制串——位运算、count() 数 1、test(i) 判位、下标访问。✅ 正确
排除法:B 变长是 vector<bool>;C/D 错。
关联 · M6 代码:bitset<8>(10) 输出 00001010。
判断题:位运算应用——状态压缩集合、快速判奇偶 x & 1、乘除 2 的幂 x << k / x >> k、交换两数 a ^= b ^= a ^= b 思想。
考点:位运算应用(G6)。
解析:状态压缩集合、x&1 判奇偶、x<<k/x>>k 乘除 2 的幂。✅ 正确
排除法:无(判断题)。混淆点:衔接第 33 章状压 DP。
关联 · N4 代码:x&(x-1)==0 判 2 的幂。
判断题:遍历中删除 vector 元素的正确写法是 it = v.erase(it)(erase 返回下一个元素的新迭代器);v.erase(it) 后继续 it++ 会迭代器失效。
考点:erase 正确写法(H1)。
解析:it = v.erase(it)——erase 返回下一个元素的新迭代器。✅ 正确
排除法:无(判断题)。混淆点:P1 实证漏删。
关联 · P1/I5/O7:三处考同一个点。
判断题:for (int x : v) 的 x 是拷贝——改 x 不影响原元素;要修改必须写 for (int &x : v)。
考点:范围 for 拷贝(H2)。
解析:for (int x : v) 的 x 是拷贝——要修改必须 int &x。✅ 正确
排除法:无(判断题)。混淆点:P2 实证改不动。
关联 · P2 代码:想清空没清掉。
判断题:v[i] 越界不检查(未定义行为);v.at(i) 越界会抛异常——稳妥用 at 或先查 size。
考点:[] 越界(H3)。
解析:v[i] 越界不检查(UB);v.at(i) 抛异常——稳妥用 at 或先查 size。✅ 正确
排除法:无(判断题)。混淆点:性能敏感处才用 []。
关联 · B1 vector 回顾:两种访问接口。
判断题:ios::sync_with_stdio(false) 关闭与 C 输入输出的同步能大幅加速 cin/cout——代价是不能再混用 scanf/printf。
考点:cin/cout 加速(H4)。
解析:sync_with_stdio(false) 关闭与 C 输入输出同步能大幅加速——不能混用 scanf/printf。✅ 正确
排除法:无(判断题)。混淆点:竞赛标配三件套(sync/tie/endl 换 '\n')。
关联 · 本章代码:所有代码题都受益。
判断题:以下结论全部正确——"set/map 有序 、unordered_* 哈希平均 ;priority_queue 默认大根堆;unique 要先 sort 且只去相邻重复;erase 返回下一个迭代器;范围 for 修改要引用;lambda 捕获 [&] 引用 [=] 值"。
考点:综合判断(H5)。
解析:六结论全对——set/map 有序 、unordered 平均 ;pq 默认大根;unique 先 sort 且只去相邻;erase 返回下一迭代器;范围 for 改要引用;lambda [&] 引用 [=] 值。✅ 正确
排除法:无(判断题)。混淆点:本章核心结论自检清单。
关联 · 本章全部核心结论:收官判断题。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v; 05 v.push_back(3); v.push_back(1); v.push_back(2); 06 sort(v.begin(), v.end()); 07 for (int x : v) cout << x << " "; 08 cout << endl << v.size(); 09 return 0; 10}
单选题:程序输出是?
考点:vector + sort(I1)。
解析:{3,1,2} push_back 后 sort → 1 2 3,size = 3。✅ 答案 A
排除法:B 没排序;C 少一个;D 是降序。
关联 · B1 vector 回顾:sort 是算法库操作容器。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 string s = "abcde"; 05 cout << s.substr(1, 3) << endl; // 从下标 1 起截 3 个 06 cout << s.substr(2) << endl; // 从下标 2 到末尾 07 return 0; 08}
单选题:程序输出是?
考点:substr 两参/单参(I2)。
解析:s="abcde":substr(1,3) 从下标 1 取 3 个 = "bcd";substr(2) 到末尾 = "cde"。✅ 答案 C
排除法:A 首项多取 1 个;B/D 第二项错。
关联 · B3 string 操作:pos 是 0 起下标。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 string s = "banana"; 05 cout << s.find("na") << " "; // 第一次出现位置 06 cout << (s.find("xyz") == string::npos) << endl; // 找不到返回 npos 07 return 0; 08}
单选题:程序输出是?
考点:find 位置与 npos(I3)。
解析:"banana" 中 "na" 首次在下标 2;"xyz" 找不到返回 npos → 比较为 1。✅ 答案 B
排除法:A 把 npos 比较写成 0;C/D 位置错。
关联 · B4 find 与 npos:找不到的判据。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 cout << stoi("123") + 1 << endl; 05 cout << to_string(45) + "6" << endl; 06 return 0; 07}
单选题:程序输出是?
考点:字符串数互转(I4)。
解析:stoi("123")+1 = 124;to_string(45)+"6" = "456"。✅ 答案 D
排除法:A 同 D 表述但选项唯一(其余均错);B 拼接了原文;C 把 + 当数值。
关联 · B5:互为逆操作。
01// 遍历中删除所有偶数(正确写法): 02for (auto it = v.begin(); it != v.end(); ) { 03 if (*it % 2 == 0) it = ______; // erase 返回下一个元素的新迭代器 04 else ++it; 05}
单选题:横线处应填入?
考点:erase 返回值(I5)。
解析:it = v.erase(it)——接收下一个元素的新迭代器。✅ 答案 A
排除法:B erase 的是值不是迭代器;C 迭代器可能失效;D 直接结束。
关联 · H1 erase 正确写法:填空即规范。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v = {1, 2, 3}; 05 v.insert(v.begin() + 1, 9); // 在下标 1 处插入 9 06 for (int x : v) cout << x << " "; 07 return 0; 08}
单选题:程序输出是?
考点:insert 位置(I6)。
解析:begin()+1 是下标 1——{1,2,3} 插入 9 得 1 9 2 3。✅ 答案 B
排除法:A 插在下标 2;C/D 位置错。
关联 · B1:insert 在指定迭代器前插入。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 set<int> s; 05 s.insert(3); s.insert(1); s.insert(2); 06 s.insert(1); s.insert(2); // 重复插入无效 07 for (int x : s) cout << x << " "; 08 cout << endl << s.size(); 09 return 0; 10}
单选题:程序输出是?
考点:set 自动去重(J1)。
解析:插入 {3,1,2,1,2} → {1,2,3},size 3。✅ 答案 C
排除法:A 无序;B 把重复算进 size;D 全保留。
关联 · C1 set 有序去重:重复插入无效。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 multiset<int> ms; 05 ms.insert(3); ms.insert(1); ms.insert(2); 06 ms.insert(1); ms.insert(2); 07 cout << ms.count(2) << " " << ms.size(); 08 return 0; 09}
单选题:程序输出是?
考点:multiset 允许重复(J2)。
解析:2 出现 2 次、总元素 5 → 2 5。✅ 答案 A
排除法:B size 3 是 set;C/D 无依据。
关联 · C2 multiset:count 计次数。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 map<string, int> m; 05 m["b"] = 2; m["a"] = 1; m["c"] = 3; // 插入顺序打乱 06 for (auto &p : m) cout << p.first << p.second << " "; 07 return 0; 08}
单选题:程序输出是?(map 按键升序遍历)
考点:map 按键升序(J3)。
解析:插入序 b,a,c 但按键序输出 a1 b2 c3。✅ 答案 D
排除法:A 是插入序;B 是逆序;C 乱序。
关联 · C4 遍历顺序:红黑树中序 = 升序。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 map<int, int> m; 05 m[1] = 10; 06 cout << m.count(1) << " " << m.count(2) << endl; 07 m[2]; // 访问不存在的键——会插入默认值 0 08 cout << m.size(); 09 return 0; 10}
单选题:程序输出是?
考点:[] 插入语义(J4)。
解析:count(1)=1、count(2)=0;随后 m[2] 访问会插入 2:0 → size 2。✅ 答案 B
排除法:A 漏了 m[2] 的插入;C/D 无依据。
关联 · C6 [] 插入语义:概念实证。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 set<int> s = {1, 3, 5, 7, 9}; 05 cout << *s.lower_bound(5) << " "; // 第一个 >= 5 06 cout << *s.lower_bound(6); // 第一个 >= 6 07 return 0; 08}
单选题:程序输出是?
考点:成员 lower_bound(J5)。
解析:lower_bound(5)=5、lower_bound(6)=7(第一个 ≥6)。✅ 答案 C
排除法:A 的 6 不存在;B 把 6 当 9;D 无依据。
关联 · C5:成员函数 O(log n)。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 set<int> s; 05 s.insert(3); s.insert(1); s.insert(2); 06 s.erase(2); // 删除 2 07 for (int x : s) cout << x << " "; 08 cout << endl << s.size(); 09 return 0; 10}
单选题:程序输出是?
考点:erase + 遍历(J6)。
解析:{1,2,3} 删 2 → {1,3},size 2。✅ 答案 A
排除法:B 没删;C size 错;D 无序。
关联 · J1:set 全套操作。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 stack<int> st; 05 st.push(1); st.push(2); st.push(3); 06 while (!st.empty()) { 07 cout << st.top() << " "; 08 st.pop(); 09 } 10 return 0; 11}
单选题:程序输出是?(后进先出)
考点:LIFO(K1)。
解析:push 1 2 3 → 弹出 3 2 1。✅ 答案 D
排除法:A 是 FIFO;B/C 漏元素。
关联 · D1 stack 回顾:后进先出。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 queue<int> q; 05 q.push(1); q.push(2); q.push(3); 06 while (!q.empty()) { 07 cout << q.front() << " "; 08 q.pop(); 09 } 10 return 0; 11}
单选题:程序输出是?(先进先出)
考点:FIFO(K2)。
解析:push 1 2 3 → 弹出 1 2 3。✅ 答案 B
排除法:A 是 LIFO;C/D 乱序。
关联 · D2 queue 回顾:先进先出。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 priority_queue<int> q; // 默认大根堆 05 q.push(3); q.push(1); q.push(2); 06 while (!q.empty()) { 07 cout << q.top() << " "; 08 q.pop(); 09 } 10 return 0; 11}
单选题:程序输出是?
考点:默认大根(K3)。
解析:priority_queue<int> 弹出 3 2 1(队首最大)。✅ 答案 C
排除法:A 是小根;B/D 乱序。
关联 · D3 默认大根堆:概念实证。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 priority_queue<int, vector<int>, greater<int>> q; // 小根堆 05 q.push(3); q.push(1); q.push(2); 06 while (!q.empty()) { 07 cout << q.top() << " "; 08 q.pop(); 09 } 10 return 0; 11}
单选题:程序输出是?
考点:greater 小根(K4)。
解析:greater<int> → 弹出 1 2 3。✅ 答案 A
排除法:B 是默认大根;C/D 乱序。
关联 · D4 greater 小根堆:第三模板参数。
01#include <bits/stdc++.h> 02using namespace std; 03struct Cmp { 04 bool operator()(int a, int b) { return a > b; } // a 更大则 a 排在后面 05}; 06int main() { 07 priority_queue<int, vector<int>, Cmp> q; // 效果:小根堆 08 q.push(3); q.push(1); q.push(2); 09 while (!q.empty()) { 10 cout << q.top() << " "; 11 q.pop(); 12 } 13 return 0; 14}
单选题:程序输出是?(注意:优先队列比较器方向与 sort 相反)
考点:比较器方向(K5)。
解析:a > b 为 true 表示 a 排后面 → 小根 → 1 2 3(与 sort 方向相反)。✅ 答案 A
排除法:B 是 sort 直觉;C/D 无依据。
关联 · D5 自定义比较器方向:pq 与 sort 反直觉。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 deque<int> d; 05 d.push_back(1); // [1] 06 d.push_front(2); // [2,1] 07 d.push_back(3); // [2,1,3] 08 d.pop_front(); // [1,3] 09 cout << d.front() << " " << d.back(); 10 return 0; 11}
单选题:程序输出是?
考点:双端操作(K6)。
解析:[2,1,3] pop_front 后 [1,3] → front 1、back 3。✅ 答案 B
排除法:A 忘了 pop;C/D 顺序错。
关联 · D6 deque 双端:两头都能动。
// 用大根堆取前 3 大的数:{3,1,4,1,5,9,2,6} → 依次弹出 9 6 5
单选题:程序输出是?
考点:前 3 大(K7)。
解析:大根堆依次弹出 9、6、5。✅ 答案 D
排除法:A 升序;B 是最小三个;C 漏 5。
关联 · K3:大根堆取 top-k。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v = {3, 1, 2}; 05 sort(v.begin(), v.end(), [](int a, int b) { return a > b; }); 06 for (int x : v) cout << x << " "; 07 return 0; 08}
单选题:程序输出是?
考点:lambda 比较器(L1)。
解析:a > b → 降序 3 2 1。✅ 答案 C
排除法:A 升序;B 未排序;D 无依据。
关联 · E1 sort 与 lambda:匿名函数就地写。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v = {1, 1, 2, 2, 3}; 05 sort(v.begin(), v.end()); // 先排序 06 v.erase(unique(v.begin(), v.end()), v.end()); 07 for (int x : v) cout << x << " "; 08 cout << endl << v.size(); 09 return 0; 10}
单选题:程序输出是?
考点:unique + erase(L2)。
解析:sort 后 unique 去相邻重复、erase 真删 → 1 2 3,size 3。✅ 答案 A
排除法:B 没删;C size 错;D 漏删。
关联 · E3 unique 去重:先 sort 再 erase。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v = {1, 2, 3}; 05 next_permutation(v.begin(), v.end()); 06 for (int x : v) cout << x << " "; 07 cout << endl; 08 prev_permutation(v.begin(), v.end()); 09 for (int x : v) cout << x << " "; 10 return 0; 11}
单选题:程序输出是?
考点:字典序下一个排列(L3)。
解析:123 → next 132 → prev 123。✅ 答案 D
排除法:A prev 未变回;B/C 无依据。
关联 · E5 next_permutation:排列枚举利器。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6}; 05 cout << *min_element(v.begin(), v.end()) << " "; 06 cout << *max_element(v.begin(), v.end()) << " "; 07 cout << count(v.begin(), v.end(), 1); 08 return 0; 09}
单选题:程序输出是?
考点:最值与计数(L4)。
解析:min 1、max 9、1 出现 2 次 → 1 9 2。✅ 答案 B
排除法:A 少计一次 1;C/D 无依据。
关联 · E6 minmax 与 count:迭代器解引用。
01sort(v.begin(), v.end(), [](int a, int b) { 02 return ______; // 降序 03});
单选题:横线处应填入?
考点:降序比较器(L5)。
解析:return a > b;。✅ 答案 C
排除法:A 升序;B/D 不是严格弱序。
关联 · F3 严格弱序:必须 < 或 >。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v = {1, 2, 3, 4, 5}; 05 cout << binary_search(v.begin(), v.end(), 3) << " "; 06 cout << *lower_bound(v.begin(), v.end(), 3) << " "; 07 cout << *upper_bound(v.begin(), v.end(), 3); 08 return 0; 09}
单选题:程序输出是?
考点:二分家族(L6)。
解析:binary_search(3)=1;lower_bound(3)=3;upper_bound(3)=4。✅ 答案 A
排除法:B upper 错;C binary 错;D 无依据。
关联 · E2/E4:三个函数一次考。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 int x = 5; 05 auto addOne = [&x]() { x++; }; // 按引用捕获 x 06 addOne(); 07 addOne(); 08 cout << x; 09 return 0; 10}
单选题:程序输出是?
考点:引用捕获(M1)。
解析:[&x] 捕获引用——两次 addOne 后 x = 7。✅ 答案 C
排除法:A 是值捕获的效果;B/D 次数错。
关联 · F2 捕获列表:[&x] 可修改。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 pair<int, int> p = {3, 1}; 05 cout << p.first << " " << p.second << " "; 06 cout << (p > make_pair(2, 9)); // 字典序比较:3 > 2 07 return 0; 08}
单选题:程序输出是?
考点:pair 字典序(M2)。
解析:first=3、second=1;{3,1} > {2,9}(先比 first)→ 1。✅ 答案 A
排除法:B 比较错;C 顺序反;D 无依据。
关联 · F5 pair 与 tuple:自带比较。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 int x = 12; // 二进制 1100 05 cout << (x & (-x)); // lowbit:最低位的 1 及其后的 0 06 return 0; 07}
单选题:程序输出是?
考点:lowbit(M3)。
解析:12 = 1100,lowbit = 100 = 4。✅ 答案 B
排除法:A 2 是 lowbit(6);C 8 是 12&11;D 无依据。
关联 · G2 lowbit:x & (-x)。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 cout << (12 & 11) << " "; // 1100 & 1011 = 1000 05 int x = 13, cnt = 0; // 1101 中 1 的个数 06 while (x) { x &= (x - 1); cnt++; } 07 cout << cnt; 08 return 0; 09}
单选题:程序输出是?
考点:x&(x-1) 与 popcount(M4)。
解析:12&11 = 8(1100&1011=1000);13(1101) 循环清零 3 次 → 3。✅ 答案 D
排除法:A/B/C 数值错。
关联 · G3 清除最低位 1:popcount 套路。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 int mask = 6; // 二进制 110 = {2, 3} 05 for (int sub = mask; sub; sub = (sub - 1) & mask) 06 cout << sub << " "; 07 return 0; 08}
单选题:程序输出是?(mask = 6 的全部非空子集)
考点:子集枚举(M5)。
解析:mask=6(110):6 → 4 → 2(递减枚举)。✅ 答案 B
排除法:A 混入 0(非空循环不含);C/D 顺序错。
关联 · G4 枚举子集:(sub-1)&mask 递减。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 bitset<8> b(10); // 10 的二进制 00001010 05 cout << b << endl; 06 cout << b.count() << " " << b.test(3) << " " << b[0]; 07 return 0; 08}
单选题:程序输出是?
考点:bitset 三操作(M6)。
解析:10 = 00001010;count()=2;test(3)=1;b[0]=0。✅ 答案 C
排除法:A b[0] 错;B 位序反;D count 错。
关联 · G5 bitset 类:输出即二进制串。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 string s = "a b a c b a"; 05 stringstream ss(s); 06 map<string, int> m; 07 string w; 08 while (ss >> w) m[w]++; 09 for (auto &p : m) cout << p.first << p.second << " "; 10 return 0; 11}
单选题:程序输出是?(词频统计,按键升序)
考点:词频统计(N1)。
解析:"a b a c b a" → a3 b2 c1,按键序输出。✅ 答案 A
排除法:B 没累加;C 逆序;D 乱序。
关联 · C3 map 键值对:计数场景。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v = {3, 1, 2, 1}; 05 set<int> s(v.begin(), v.end()); // 用 vector 初始化 set 06 vector<int> u(s.begin(), s.end()); // 用 set 初始化 vector 07 for (int x : u) cout << x << " "; 08 cout << endl << s.size(); 09 return 0; 10}
单选题:程序输出是?
考点:容器互转去重(N2)。
解析:set 去重得 {1,2,3},转回 vector 输出 1 2 3,size 3。✅ 答案 C
排除法:A 重复保留;B 未去重;D size 错。
关联 · C1:去重惯用法。
// 用小根堆维护前 3 大:依次处理 {3,1,4,1,5,9,2,6}
// 堆内始终是当前已见元素中最大的 3 个
// 5 顶掉 1、9 顶掉 4、6 顶掉 4 → 最终 {5,6,9}
单选题:程序输出是?(升序输出堆内元素)
考点:小根堆维护前 k 大(N3)。
解析:5 顶 1、9 顶 4、6 顶 4 → {5,6,9}。✅ 答案 D
排除法:A/B 含 4;C 是降序。
关联 · K4:小根堆门槛法。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 cout << ((8 & 7) == 0) << " "; // 8 是 2 的幂 05 cout << ((12 & 11) == 0); // 12 不是 2 的幂 06 return 0; 07}
单选题:程序输出是?
考点:判 2 的幂(N4)。
解析:8&7=0(是 2 的幂)、12&11=8≠0(不是)→ 1 0。✅ 答案 A
排除法:B/C/D 逻辑反。
关联 · G6 位运算应用:x&(x-1)==0 判 2 的幂。
01priority_queue<int, vector<int>, ______> q; // 小根堆
单选题:横线处应填入?
考点:小根堆声明(N5)。
解析:第三模板参数填 greater<int>——第一参数元素类型、第二参数底层容器(默认 vector)、第三参数比较器。✅ 答案 B
排除法:A less<int> 是默认的大根堆;C/D 类型不匹配。
关联 · D4:声明三件套。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 string s = "1 2 3"; 05 stringstream ss(s); 06 int x, sum = 0; 07 while (ss >> x) sum += x; 08 cout << sum; 09 return 0; 10}
单选题:程序输出是?(stringstream 逐个提取整数求和)
考点:stringstream 提取(N6)。
解析:"1 2 3" 逐个提取求和 = 6。✅ 答案 C
排除法:A 123 是拼接;B 3 是元素数;D 1 是首元素。
关联 · B3 string 操作:字符串解析利器。
01vector<int> v = {3, 1, 2}; 02sort(v.begin(), v.end(), ①); // 降序排序
单选题:①处应填?
考点:降序 lambda(O1)。
解析:[](int a, int b) { return a > b; }。✅ 答案 D
排除法:A greater 缺类型参数且是模板;B/C 是升序。
关联 · L1:同空再考。
01map<int, int> m; 02if (①) cout << "存在"; // 判断键 5 是否存在
单选题:①处应填?
考点:判存在(O2)。
解析:m.find(5) != m.end() 不插入地判断。✅ 答案 C
排除法:A/B 用 [] 会误插入;D 语义错。
关联 · C6 [] 插入语义:find 才安全。
01priority_queue<int, vector<int>, ①> q; // 小根堆
单选题:①处应填?
考点:小根堆(O3)。
解析:greater<int>。✅ 答案 A
排除法:B less 是大根;C 缺模板参数;D 底层容器不对。
关联 · N5:同空再考。
01vector<int> v = {1, 1, 2, 2, 3}; 02sort(v.begin(), v.end()); 03v.erase(①, v.end()); // 删掉 unique 之后的多余元素
单选题:①处应填?
考点:erase 起点(O4)。
解析:从 unique(v.begin(), v.end()) 到末尾删除。✅ 答案 B
排除法:A 删错区间;C/D 无依据。
关联 · L2:填空即惯用式。
01int x = 0; 02auto add = [①](int v) { x += v; }; // 按引用捕获 x,累加 03add(3); add(4);
单选题:①处应填?
考点:引用捕获(O5)。
解析:[&x]——按引用捕获才能累加。✅ 答案 D
排除法:A = 是值捕获(编译错:不可改);B/C 语法错。
关联 · M1:同空再考。
bitset<8> b(10); cout << b.①; // 输出 1 的个数(10 → 2)
单选题:①处应填?
考点:count()(O6)。
解析:b.count() 数 1 的个数。✅ 答案 C
排除法:A size 是位数;B 是字符串;D test 要参数。
关联 · M6:同空再考。
01for (auto it = v.begin(); it != v.end(); ) { 02 if (*it % 2 == 0) it = ①; // 删除偶数,拿到下一个迭代器 03 else ++it; 04}
单选题:①处应填?
考点:erase 返回值(O7)。
解析:it = v.erase(it)。✅ 答案 A
排除法:B 会失效;C 参数错;D 从头再来。
关联 · I5:同空三考——最重要的一空。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v = {1, 2, 4, 3}; 05 for (auto it = v.begin(); it != v.end(); ++it) { 06 if (*it % 2 == 0) 07 v.erase(it); // 注意:erase 后 it 失效,++it 会跳过元素 08 } 09 for (int x : v) cout << x << " "; 10 return 0; 11}
单选题:程序输出是?(正确结果应为 1 3——4 被漏删)
考点:失效漏删(P1)。
解析:{1,2,4,3}:删 2 后 it 指向 4,++it 跳过 4 → 漏删 → 1 4 3。✅ 答案 B
排除法:A 1 3 是正确结果;C 全保留;D 无依据。
关联 · H1/I5/O7:最经典 STL 坑。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 vector<int> v = {1, 2, 3}; 05 for (int x : v) x = 0; // 注意:x 是拷贝,改它不影响原元素 06 for (int x : v) cout << x << " "; 07 return 0; 08}
单选题:程序输出是?(想清空却没清掉)
考点:拷贝改不动(P2)。
解析:x 是拷贝——赋值 x=0 不影响原元素,输出 1 2 3。✅ 答案 C
排除法:A 0 0 0 是引用才有的效果;B/D 无依据。
关联 · H2 范围 for 拷贝:要改就 int &x。
01// 想按升序排序,但 lambda 比较器写反了: 02vector<int> v = {3, 1, 2}; 03sort(v.begin(), v.end(), [](int a, int b) { return a > b; });
单选题:程序输出是?(预期升序 1 2 3,实际得降序)
考点:降序写成升序意图(P3)。
解析:想升序却写 a > b → 输出 3 2 1。✅ 答案 A
排除法:B 1 2 3 是期望值;C/D 无依据。
关联 · F3 严格弱序:方向感要清醒。
01#include <bits/stdc++.h> 02using namespace std; 03int main() { 04 map<int, int> m; 05 m[1] = 10; 06 if (m[2] == 0) { // 注意:m[2] 会把 2 插入 map 07 // 本想检查 2 是否存在 08 } 09 cout << m.size(); // 应为 1,实际变 2 10 return 0; 11}
单选题:程序输出是?(正确结果应为 1)
考点:[] 检查存在的副作用(P4)。
解析:m[2] 把 2:0 插入 map——size 从 1 变 2。✅ 答案 D
排除法:A 1 是正确结果;B/C 无依据。
关联 · C6/O2:检查存在用 find/count。
01// 在 set 上查找: 02std::lower_bound(s.begin(), s.end(), x); // 注意:这是 O(n) 的 03// 而成员函数 s.lower_bound(x) 才是 O(log n)
单选题:判断题——std::lower_bound 用在 set 上时,因为 set 迭代器不支持随机访问,复杂度退化为 ?
考点:复杂度退化(P5)。
解析:set 迭代器无随机访问——std::lower_bound 退化为 ,成员函数才 。✅ 正确
排除法:无(判断题)。混淆点:能编译不代表高效。
关联 · C5 成员 lower_bound:概念第三次考。
判断题:以下五种易错写法都会导致程序出错或行为异常——①erase 后不接收返回迭代器继续 ++(漏删元素)②范围 for 用值拷贝想修改原元素(改不动)③sort 比较器方向写反(排序结果相反)④用 m[key] 检查键是否存在(误插入默认值)⑤在 set 上用 std::lower_bound(复杂度退化为 )。
考点:五种易错综合判断(P6)。
解析:五条全对——erase 不接返回值漏删、范围 for 拷贝改不动、比较器反、[] 误插入、std 二分退化。✅ 正确
排除法:无(判断题)。混淆点:每条对应 P1~P5 一道实证题。
关联 · P1~P5:收官章易错自查。