GESP 五级 · GESP 202309 C++ 五级 第 7 题

选择题 · 答案 A · 考点:函数

← 整套速查表 GESP 五级 全部真题

题目

根据下面 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;
}
答案:A

考点

函数

解题思维

这题核心就是考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的参数传递规则。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断