C ++使用迭代器将函数映射到iterable上

时间:2012-04-16 01:48:16

标签: c++ oop functional-programming

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

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// do something different with res(针对每种情况),重用代码将是微不足道的。这样做的缺点是我(不必要地)需要存储一长串的大std::vector个。一方面,我尽可能确定它不会占用比我更多的内存;但即便如此,不必要地存储大量数据似乎也是不好的做法。

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

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

选项3+(???):

我真的很想听听你对如何在C ++中处理这类问题的建议。提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

如果你确实需要副本,那么在这两种情况下你很可能需要一个不同的副本,所以你的选项0不起作用。

如果要从列表中的向量编译mash-up值集合,迭代器选项对我来说听起来最好 - 每次调用operator++时,都可以动态计算下一个元素。 / p>