下面的 C++ 代码执行后将输出 0 5 1 6 2 3 4。
#include <iostream>
#include <algorithm>
using namespace std;
bool compareModulo5(int a, int b) {
return a % 5 < b % 5;
}
int main() {
int lst[7];
for (int i = 0; i < 7; i++)
lst[i] = i;
// 对序列所有元素按compareModulo5结果排序
sort(lst, lst + 7, compareModulo5);
for (int i = 0; i < 7; i++)
cout << lst[i] << " ";
cout << endl;
return 0;
}STL 容器:vector(动态数组)、set/map(红黑树,有序)、unordered_set/map(哈希表,无序)。注意迭代器失效问题。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】自定义比较函数|std::sort稳定性|余数分组排序
1. 🎯 考纲定位:GESP五级"数组与排序"模块核心考点。命题人用此题卡住考生对自定义比较函数作用范围的理解——很多人误以为sort会打乱等价元素顺序,其实std::sort在比较函数返回false时(等价)会保持原相对顺序。
2. 🧠 解题思维:原数组[0,1,2,3,4,5,6]按余数分组:余0→{0,5},余1→{1,6},余2~4各一。sort按余数升序排列各组,组内元素因比较函数返回false而保持原始先后关系,故0在5前、1在6前,输出0 5 1 6 2 3 4正确。
3. 🪤 陷阱拆解:错误选项B利用"排序必打乱等价项"的直觉误区。命题人偷换概念——compareModulo5(a,b)与compareModulo5(b,a)同假时视为相等,std::sort对相等元素不交换。若考生只背"sort不稳定"而忽略比较函数返回false的含义,必掉此坑。
4. 🔄 反命题思维:若将compareModulo5改为"余数降序"或"余数相同则按原值排序",输出会变为6 5 4 3 2 1 0或0 5 1 6 2 3 4(组内按值排序)。刷到类似题先问:比较函数在等价时返回什么?这决定了组内顺序是否确定。