C++:如何做方案的"map"
C++: how to do "map" of Scheme
下面是Scheme的示例代码(如果我错了,请纠正我):
(define (translate points delta)
(map
(lambda (x)
(+ x delta)
)
points
)
)
基本上它定义了一个 lambda 函数,将delta
添加到输入x
,然后将其应用于每个points
项。
我发现这样的功能非常有趣,它省略了所有迭代器等。
是否有可能以优雅的方式在C++中做这样的"地图"?
根据回复更新:
更具体地说,有没有办法在C++中实现 Scheme 的这种"地图"功能,以便它可以优雅地使用?也许一个名为"map"的模板函数接受函数指针/函子和容器?
在习惯C++中,最接近代码的翻译是使用带有std::back_inserter
的std::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
,您传递的不是容器而是一对迭代器)。 我个人认为这不是一个好主意,但这是语言的设计方式。
相关文章:
- 运行同一解决方案的另一个项目的项目
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- Project Euler问题4的错误解决方案
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 允许从 std::map 的密钥窃取资源?
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 将重物插入std::map
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- std::map的线程安全替代方案
- C++:如何做方案的"map"
- STL std::map 的更快替代方案
- std::map是一个好的解决方案吗