根据下面 C++ 代码的注释,两个横线处应分别填入( )。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool isOdd(int N) {
return N % 2 == 1;
}
bool compare(int a, int b) {
if (a % 2 == 0 && b % 2 == 1)
return true;
return false;
}
int main() {
vector<int> lstA; // lstA是一个整型向量
for (int i = 1; i < 100; i++)
lstA.push_back(i);
// 对lstA成员按比较函数执行结果排序
sort(lstA.begin(), lstA.end(), ________); // 此处填写代码1
vector<int> lstB;
for (int i = 0; i < lstA.size(); i++) // lstB成员全为奇数
if (________) // 此处填写代码2
lstB.push_back(lstA[i]);
cout << "lstA: ";
for (int i = 0; i < lstA.size(); i++)
cout << lstA[i] << " ";
cout << endl;
cout << "lstB: ";
for (int i = 0; i < lstB.size(); i++)
cout << lstB[i] << " ";
cout << endl;
return 0;
}这题核心就是考STL sort的传参规则和函数调用本质。sort那个空要填函数名(指针),if那个空要填函数调用(值)。拿到题先想:sort需要比较器,if需要布尔值,然后看compare和isOdd的定义,就能确定填什么了。
学生最容易把sort里的compare写成compare(x,y),以为这样能传进去,其实sort只接受函数指针,传调用会编译错;另一个坑是把if里的isOdd写成isOdd,忘了if条件需要bool值,函数名默认传指针,没参数直接报错。很多人纠结括号要不要,其实只要记住sort要函数名,if要函数调用,就不会错。
【考点】自定义排序比较函数与函数指针传递
这题考的是STL标准库里sort的用法和函数调用规则。sort需要传一个比较函数指针,用来决定元素先后顺序;if条件需要传一个布尔表达式,用来判断是否执行。命题人特意在这里挖坑,就是看学生能不能分清“函数名”和“函数调用”的区别。
【概念人话版】 compare函数定义是bool compare(int a, int b),它返回true表示a排在b前面,false表示a排在b后面。sort排序时,会把两个元素扔给compare,看compare返回啥,来决定谁该在前。所以sort需要的是compare这个函数的地址(指针),让sort自己去调用它。 isOdd函数定义是bool isOdd(int N),它返回N是不是奇数。if条件里需要的是true或false,所以必须调用isOdd,把lstA[i]传进去,得到结果再判断。
【思考心法与推演】 看到sort(lstA.begin(), lstA.end(), ________),第一反应:sort需要比较函数,填compare还是compare(x1,y1)?compare是函数名,默认传函数指针,sort会自己去调用;compare(x1,y1)是函数调用,返回bool值,sort没法用。所以第一个空只能填compare。 看到if(________) lstB.push_back(...),第二反应:if条件需要布尔值,填isOdd还是isOdd(lstA[i])?isOdd是函数名,默认传指针,if里没参数会报错;isOdd(lstA[i])是调用,返回bool,if能判断。而且lstA已经按compare排好了(偶数在前,奇数在后),i从0开始遍历,遇到奇数才push到lstB,所以第二个空只能填isOdd(lstA[i])。
【避坑指南】 最容易错的是把sort里的compare写成compare(x1,y1),以为这样能传进去,其实sort只接受函数指针,传调用会编译错;另一个坑是把if里的isOdd写成isOdd,忘了if条件需要bool值,函数名默认传指针,没参数直接报错。很多人纠结括号要不要,其实只要记住sort要函数名,if要函数调用,就不会错。
【考频与趋势】 STL标准库在题库里共考过112题,覆盖4个级别,2023年13题、2024年22题、2025年47题、2026年26题,GESP五级占了65题,说明这是高频考点。排序基础共249题,GESP五级74题,sort排序共128题,GESP五级67题,都是五级重灾区。历年看,2023年18题、2024年39题、2025年42题、2026年18题,波动较大,但总体保持每年20-40题左右,命题人喜欢在sort传参细节上挖坑。
【预测】 基于数据,sort传参规则(函数指针vs调用)和if条件(布尔值vs指针)这类陷阱在GESP五级未来几年仍会高频出现,可能还会结合lambda表达式考更复杂的排序逻辑,但基础版大概率还是考函数名和调用形式的区分。暂无足够依据预测具体年份的题型变化,但建议重点复习sort和if的参数传递规则。