MST

星途 面试题库

面试题:C++复杂数据结构下transform的数据过滤

给定一个`std::vector<std::pair<int, std::string>>`,其中`pair`的第一个元素是年龄,第二个元素是姓名。请利用`transform`算法,过滤掉年龄小于18岁的`pair`,并将剩下的`pair`中的姓名全部转换为大写形式(可借助`<algorithm>`中的`transform`和`<cctype>`中的`toupper`等函数),输出处理后的`vector`。写出关键代码片段,并解释实现思路。
22.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <vector>
#include <algorithm>
#include <cctype>
#include <string>

using namespace std;

// 函数对象,用于过滤年龄小于18岁的pair
struct FilterByAge {
    bool operator()(const pair<int, string>& p) {
        return p.first >= 18;
    }
};

// 函数对象,用于将字符串转换为大写
struct ToUpper {
    string operator()(const string& s) {
        string result = s;
        transform(result.begin(), result.end(), result.begin(), [](unsigned char c) {
            return toupper(c);
        });
        return result;
    }
};

int main() {
    vector<pair<int, string>> people = {
        {17, "Alice"},
        {20, "Bob"},
        {15, "Charlie"},
        {25, "David"}
    };

    // 使用erase - remove_if过滤年龄小于18岁的pair
    people.erase(remove_if(people.begin(), people.end(), FilterByAge()), people.end());

    // 将剩下的pair中的姓名全部转换为大写形式
    transform(people.begin(), people.end(), people.begin(), [](pair<int, string>& p) {
        p.second = ToUpper()(p.second);
        return p;
    });

    // 输出处理后的vector
    for (const auto& p : people) {
        cout << p.first << " " << p.second << endl;
    }

    return 0;
}

实现思路

  1. 过滤年龄小于18岁的pair
    • 定义一个函数对象FilterByAge,重载()运算符,用于判断pair中的年龄是否大于等于18岁。
    • 使用erase - remove_if惯用法,remove_if算法会将不符合条件(年龄小于18岁)的元素移动到容器末尾,并返回指向新的逻辑末尾的迭代器,erase方法则删除这些移动到末尾的元素,从而实现过滤。
  2. 将剩下的pair中的姓名全部转换为大写形式
    • 定义一个函数对象ToUpper,重载()运算符,在其中使用<algorithm>中的transform<cctype>中的toupper函数将字符串转换为大写形式。
    • 再使用transform算法,遍历处理后的vector,对每个pair中的字符串调用ToUpper函数对象进行转换。
  3. 输出处理后的vector
    • 使用范围for循环遍历处理后的vector,输出每个pair中的年龄和转换为大写后的姓名。