C++:如何做方案的"map"

C++: how to do "map" of Scheme

本文关键字:map 方案 何做 C++      更新时间:2023-10-16

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

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

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

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

是否有可能以优雅的方式在C++中做这样的"地图"?

根据回复更新:

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

在习惯C++中,最接近代码的翻译是使用带有std::back_inserterstd::transform

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);

C++版本称为std::transform

没有预定义的完全等价物...但写起来并不难:

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,您传递的不是容器而是一对迭代器)。 我个人认为这不是一个好主意,但这是语言的设计方式。