0

我有一个接受大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或(对于每种情况)来重用代码是微不足道的。这样做的缺点是我(不必要地)需要存储一长串大s。一方面,我确信它不会使用比我更多的内存;但即便如此,不必要地存储大量数据似乎是一种不好的做法。all_values// do something with res// do something different with resstd::vector

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

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

选项 3+ (???):

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

4

1 回答 1

1

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

如果您确实需要一个副本,您很可能在这两种情况下都需要一个不同的副本,因此您的选项 0 将不起作用。

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

于 2012-04-16T01:58:56.060 回答