我有一个函数接受大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 ++中处理这类问题的建议。提前谢谢。
答案 0 :(得分:1)
为什么需要按值返回向量?如果您可以通过引用返回并使用vector<double>::const_iterator
,则可以放心,您不会修改原始矢量。
如果你确实需要副本,那么在这两种情况下你很可能需要一个不同的副本,所以你的选项0不起作用。
如果要从列表中的向量编译mash-up值集合,迭代器选项对我来说听起来最好 - 每次调用operator++
时,都可以动态计算下一个元素。 / p>