我有一个函数接受大型 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/