C++使用迭代器将函数映射到可迭代对象上

标签 c++ oop functional-programming

我有一个函数接受大型 std::vectors(由 const & 传递)并返回大型 vector (按值)。在我的代码的一部分中,我需要做:

std::list<std::vector<double> > all_vectors;
// all_vectors is filled with values somewhere in here
for (const std::vector & v : all_values)
{
   std::vector<double> res = f(v);
   // do something with res
}

在我的代码的另一部分,我需要做的是:

std::list<std::vector<double> > all_vectors;
// all_vectors is filled with values somewhere in here
for (const std::vector & v : all_values)
{
   std::vector<double> res = f(v);
   // do something different with res
}

最简单的选项(内存消耗): 通过简单地将 f 映射到 all_values 然后遍历结果并执行 //do something with res//对 res 做一些不同的事情(针对每种情况)。这样做的缺点是我(不必要地)需要存储一长串大型 std::vector。一方面,我非常确定它不会使用比我更多的内存;但即便如此,不必要地存储大量数据似乎是一种不好的做法。

选项 1(使用迭代器根据请求生成结果): 一种选择是创建一些 iterator_map 函数,其行为类似于 map,但会根据需要生成结果。我认为这对于 Python 的 yield 来说是非常可行的。

选项 2(使用面向对象的设计): 另一种选择是使用 ABC 继承并覆盖函数 g:在一个派生类中,g 将执行 //做某事使用 res,而在另一个中,它将执行 //do something different with res.

选项 3+ (???):

我真的很想听听您关于如何在 C++ 中处理此类问题的建议。提前致谢。

最佳答案

为什么需要按值返回 vector ?如果您可以通过引用返回并使用 vector<double>::const_iterator ,您可以放心,您不会修改原始 vector 。

如果您确实需要一份拷贝,那么在这两种情况下您很可能需要一份不同的拷贝,因此您的选项 0 将不起作用。

如果您要从列表中的 vector 编译值的混搭集合,迭代器选项对我来说听起来是最好的——每次您调用 operator++ ,可以动态计算下一个元素。

关于C++使用迭代器将函数映射到可迭代对象上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10167855/

相关文章:

c++ - Clang 不能与 std::experimental::optional 一起正常工作

c++ - 基类成员函数内部的静态变量

javascript - 面向对象的 Javascript : How to define an object with variable form same object

scala - 从有状态算法创建 Enumeratee

c++ - STL 设置未正确添加 c++

c++ - Windows EVENTLOGRECORD 结构中的可变长度字段如何工作?

functional-programming - 调用后构建 n 大小数组的函数的空间复杂度

functional-programming - 如何在标准 ML 中打印多态值?

java - 构造函数执行后的初始化域

java - AOP 能做什么而 OOP 不能做什么?