以下是Scheme的示例代码(如果我错了,请更正我):
(define (translate points delta)
(map
(lambda (x)
(+ x delta)
)
points
)
)
基本上它定义了一个lambda函数,它将delta
添加到输入x
,然后将其应用于points
的每个项目。
我发现这个功能非常有趣,它省略了所有的迭代器等等。
是否可以这样做" map"在C ++中,以一种优雅的方式?
根据回复更新:
更具体地说,有没有办法实现这样的" map" Scheme的功能,在C ++中,以便它可以优雅地使用?也许一个名为" map"的模板函数接受函数指针/函子和容器?
答案 0 :(得分:4)
您在惯用C ++中最接近的代码翻译是将std::transform
与std::back_inserter
一起使用:
std::vector<point> points{…};
std::vector<point> output;
// optional, may improve performance:
output.reserve(points.size());
auto lambda = [=](point x) { return x + delta; };
std::transform(begin(points), end(points), std::back_inserter(output), lambda);
此处,lambda
按值捕获其周围范围 - 这由[=]
前缀表示。这样就可以在其中使用delta
。
但是,对于T -> T
转换,您通常会使用就地变体,而不是将值推送到新容器中:
std::vector<point> points{…};
auto lambda = [=](point x) { return x + delta; };
std::transform(begin(points), end(points), begin(points), lambda);
答案 1 :(得分:2)
C ++版本称为std::transform
。
答案 2 :(得分:1)
没有预先确定的完全等效......但写起来并不困难:
template<typename T, typename F>
T mymap(const T& container, F f) {
T result;
for (auto const & x : container) {
result.push_back(f(x));
}
return result;
}
std::vector<int> translate(const std::vector<int>& x, int delta) {
return mymap(x, [=](int x){return x+delta;});
}
与方案map
类似的东西是std::transform
,但要求您提供存储转换元素的位置的输出迭代器。
C ++标准库是围绕迭代器对的概念构建的(例如,即使对于sort
,您也不能传递容器,而是传递一对迭代器。我个人认为这不是一个好主意,但它是语言设计的方式。