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