在递归函数 C++ 中创建向量

Posted

技术标签:

【中文标题】在递归函数 C++ 中创建向量【英文标题】:Creating vectors in Recursive Function C++ 【发布时间】:2020-09-20 02:39:35 【问题描述】:

我有一个递归函数,其中传递了一个对象向量。我需要遍历这个向量并根据某些条件取出元素。 这是一种更有效的方法-

a) 在函数体中声明一个临时向量

function(vector<obj> &arr,int l,int r)
some other stuff
vector<obj> temp;
adding elements based on some condition and operating

b) 声明一个全局临时向量之类的东西(或通过引用将其传递给函数),然后在函数体内清除它并执行所需的步骤。

function(vector<obj> &arr,vector<obj> &temp,int l,int r)
some other stuff
temp.clear();
adding elements based on some condition and operating

我同意这可能不会显着提高性能,但只是想了解哪种做法更好。如果您认为它更有效,请添加一些其他方法。

【问题讨论】:

为什么不同时尝试它们并测量时间? 是的,这是一个可行的选择,但我一直在寻找为什么一个比另一个更好。 为什么需要递归遍历向量?如果涉及回溯,递归是好的,但“遍历向量”不是利用它的东西。 我认为您现在的问题过于笼统,无法正确回答。我们需要有关您的确切问题的更多信息。 @Dialectus 对不起,我想我应该解释更多,例如在link,一个分而治之的范式,距离中点一定距离的点被添加到一个单独的列表中然后进行操作,我想做类似的事情。过滤只是递归过程的一部分。 【参考方案1】:

如果向量真的很大,那么还有第三种选择。

创建一个新向量,将其容量设置为输入向量,并向其中添加内容,而不是从原始向量中删除内容。

当你从一个大向量中删除一个项目时,它之后的所有其他项目必须移动一个位置。这样做很浪费,所以最好避免。

当您将容量设置为向量时,会提前占用空间,当您向其中添加新项目时,它的大小不会逐渐增长,并且当向量当前处于当前状态时,底层代码不必复制现有项目容量达到了,这可能会发生很多。

但还有更多。您可以使用输入向量作为输出。当您迭代向量时,您会将项目复制到要删除的位置。每次删除某些项目时,向量中都会有一个“移动洞”,该洞会增长,并且项目只会从“洞”的末端复制到开头,从而有效地移动洞。当孔到达末端时,您只需将其从向量中切断,这就是您的输出。

【讨论】:

这实际上不是一个坏主意,因为使用的存储空间将远远超过实际需要。另外,假设我使用了 clear() 函数,在这种情况下是否仍会推荐它?

以上是关于在递归函数 C++ 中创建向量的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中创建 n-tree

C++向量在递归函数中丢失数据

是否可以在球拍中创建匿名递归函数

如何在python中创建一个通过递归减少n的函数

如何在 C++ 中的类中递归调用函数方法?

如何在Python中创建一个递归函数来创建一个映射Odoo 8关系字段记录的字典?