MST
星途 面试题库

面试题:C++ STL transform复杂数据结构批量处理

假设有一个`std::vector<std::pair<int, int>>`,表示一系列的坐标点。使用`std::transform`算法,将每个坐标点的x和y值都加上10,最终返回处理后的`std::vector<std::pair<int, int>>`。请编写完整的C++代码实现此功能,并阐述你选择使用的`std::transform`重载版本及其原因。
12.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>

std::vector<std::pair<int, int>> transformPoints(const std::vector<std::pair<int, int>>& points) {
    std::vector<std::pair<int, int>> result(points.size());
    std::transform(points.begin(), points.end(), result.begin(), [](const std::pair<int, int>& p) {
        return std::make_pair(p.first + 10, p.second + 10);
    });
    return result;
}

int main() {
    std::vector<std::pair<int, int>> points = {{1, 2}, {3, 4}, {5, 6}};
    auto newPoints = transformPoints(points);
    for (const auto& p : newPoints) {
        std::cout << "(" << p.first << ", " << p.second << ") ";
    }
    std::cout << std::endl;
    return 0;
}

选择的std::transform重载版本及其原因

选择的重载版本为:

template< class InputIt, class OutputIt, class UnaryOperation >
OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op );

原因如下:

  1. 输入输出范围明确:该版本接受输入范围 [first1, last1) 和输出起始位置 d_first,可以方便地对 std::vector<std::pair<int, int>> 的元素进行逐个处理,并将结果存储到新的 std::vector 中。
  2. 操作简单灵活:通过传入一个可调用对象 unary_op,可以定义对每个元素的具体操作。在这里,使用lambda表达式对每个 std::pair<int, int>firstsecond 成员分别加上10,简洁且直观。
  3. 适配需求:此版本不需要额外的中间容器或复杂的操作,直接将处理结果输出到目标容器,符合题目要求,能够高效地完成对坐标点的转换操作。