下面的 C++ 代码用于输出每个数对应的质因数列表,输出形如:{5: [5], 6: [2, 3], 7: [7], 8: [2, 2, 2]}。
int main() {
int n, m;
cin >> n >> m;
if (n > m) swap(n, m);
map<int, vector<int>> prime_factor;
for (int i = n; i <= m; ++i) {
int j = 2, k = i;
while (k != 1) {
if (k % j == 0) {
prime_factor[i] = prime_factor[i] + j;
k /= j;
} else {
++j;
}
}
}
for (auto& p : prime_factor) {
cout << p.first << ": ";
for (int v : p.second)
cout << v << " ";
cout << endl;
}
return 0;
}STL 容器:vector(动态数组)、set/map(红黑树,有序)、unordered_set/map(哈希表,无序)。注意迭代器失效问题。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】C++ map 复合赋值|vector 类型匹配
考纲定位:本题直击 GESP 五级 C++ 标准库核心——map 复合赋值运算符的行为边界。命题人故意把这道题放在试卷里,就是卡住那些只背"map 可以用 += "结论,却不理解其类型约束的考生。
解题思维:看到 prime_factor[i] = prime_factor[i] + j 先反应:+= 是复合赋值,但 += 的右操作数必须是 map 的 value_type。关键观察:prime_factor[i] + j 是 vector<int> 的加法(返回 vector),而 map 的 += 只接受 vector,不接受 int。推理依据:C++ 标准库的 map 迭代器与赋值重载规则。这一类题的通法是:遇到 map/set 的复合赋值时,先确认右操作数类型是否与 map 的 value_type 完全匹配。
陷阱拆解:选项 A 是命题人精心设计的"正确"诱饵。错误点在于:prime_factor[i] + j 是 vector 加法,返回 vector,但 map 的 += 只接受 vector,不接受 int。最阴险的细节是"偷换类型"——把 int 包装成 vector 却仍用 += 赋值,看似合理实则违背重载规则。如果你只背结论、不理解本质,就会掉进这个陷阱。
反命题思维:如果把代码改成 prime_factor[i] += {j},就会正确累加,因为 {j} 是 vector 的初始化列表,符合 += 要求。刷题时先问自己:map 的复合赋值到底接受什么类型?