在类中定义变量时共享指针中的递归
Posted
技术标签:
【中文标题】在类中定义变量时共享指针中的递归【英文标题】:Recursion in shared pointers while variable is defined in the class 【发布时间】:2017-07-11 06:33:15 【问题描述】:我有一个简单的问题。我有一个 LinkList 类,并且在该类中启动了 root。
class LinkList
struct node
int data;
shared_ptr<node> next;
;
shared_ptr<node> root;
public:
void insert(int data);
void remove(int data);
void print();
int length();
bool search_recursive(int data);
bool search_recursiveUtil(shared_ptr<node> p, int data);
理想情况下,我想实现一个递归函数来搜索节点。现在我通过以下方式实现:
bool LinkList::search_recursiveUtil(shared_ptr<node> p, int data)
if(p == nullptr)
return false;
if(p->data == data)
return true;
return search_recursiveUtil(p->next, data);
bool LinkList::search_recursive(int data)
shared_ptr<node> p = root;
return search_recursiveUtil(p, data);
现在您可以清楚地看到,由于我不希望 root 到达链表的末尾,因为其他函数可能会使用这个头指针来做某事,所以我正在获取一个共享指针 P 并遍历它。现在我想让 p 传递给“search_recursive”函数,但由于它不接受 shared_ptr 参数,所以我不得不支持“search_recursiveUtil”函数。
我的问题是正确的方法吗?在没有 util 功能支持的情况下如何实现这一点?
【问题讨论】:
为什么要递归?递归解决方案几乎没有什么好处。这是令人难以置信的空间效率低下。 没什么问题,但我会以迭代的方式实现它,这样会更有效率。 另请注意,与通过 const red 支付相比,按值传递共享指针有相当多的开销(当然语义不同,但在您的情况下两者都可以) 我知道递归不是一种有效的方法,但我想尝试一下。 什么是迭代方式?你能解释一下,或者是一个示例代码吗? 【参考方案1】:除了考虑为什么使用递归搜索(一旦列表变得足够大就会很快导致堆栈溢出)而不是迭代搜索,因为指针是按值传递的,所以不需要@987654321 @:只需致电return search_recursiveUtil(root, data)
。您将 root 推到列表末尾的推理是一种误解。
使用 xUtil 函数在从外部调用搜索时获取不需要的位置参数可能是一个好主意,只需将其设为类私有,这样 - 从外部 - 您的界面将只是 search_recursive
功能。
另外,声明两个函数const
,因为它们不应该修改数据。
另一种方法可以将“Util”函数作为节点成员,这样你就可以做到
bool LinkList::node::search_recursiveUtil(int src_data)
if(data == src_data)
return true;
if(pnext == nullptr)
return false;
return pnext->search_recursiveUtil(src_data);
称为
bool LinkList::search_recursive(int data)
root->search_recursiveUtil(data);
【讨论】:
感谢您的详细回答。特别是关于误解。 你能解释一下这些行吗? “使用 xUtil 函数在从外部调用搜索时获取不需要的位置参数可能是一个好主意,只需将其设为类私有,这样 - 从外部 - 您的界面将只是 search_recursive 函数。另外,声明这两个函数 const,因为它们不应该修改数据。替代方法可以将“Util”函数作为节点成员,以便您可以执行“ 好的,现在我明白了。如果我创建一个 const 函数,那么它不会修改它被调用的对象并且代码工作正常 :) 谢谢 Emilio。【参考方案2】:原则上,这正是要走的路:
您的接口函数带有必要的参数,可以调用带有所需参数的内部函数。这样你就可以隐藏你的 root
成员变量。您甚至可以/应该将您的 util 成员函数声明为私有。
【讨论】:
以上是关于在类中定义变量时共享指针中的递归的主要内容,如果未能解决你的问题,请参考以下文章