C ++:怎么做" map"计划

时间:2014-12-30 09:20:10

标签: c++ functional-programming

以下是Scheme的示例代码(如果我错了,请更正我):

(define (translate points delta)
    (map 
        (lambda (x)
            (+ x delta)
        )
        points 
    )
)

基本上它定义了一个lambda函数,它将delta添加到输入x,然后将其应用于points的每个项目。

我发现这个功能非常有趣,它省略了所有的迭代器等等。

是否可以这样做" map"在C ++中,以一种优雅的方式?

根据回复更新:

更具体地说,有没有办法实现这样的" map" Scheme的功能,在C ++中,以便它可以优雅地使用?也许一个名为" map"的模板函数接受函数指针/函子和容器?

3 个答案:

答案 0 :(得分:4)

您在惯用C ++中最接近的代码翻译是将std::transformstd::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,您也不能传递容器,而是传递一对迭代器。我个人认为这不是一个好主意,但它是语言设计的方式。