在递归函数 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++ 中创建向量的主要内容,如果未能解决你的问题,请参考以下文章