在类中定义变量时共享指针中的递归

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 成员函数声明为私有。

【讨论】:

以上是关于在类中定义变量时共享指针中的递归的主要内容,如果未能解决你的问题,请参考以下文章

能定义在类中的内容

共享指针递归删除递归数据结构,堆栈溢出

不同风格的递归,引用/全局/指针变量的使用

java中的变量

方法,重载,递归,面向对象

关于“只有静态常量整型数据成员才可以在类中初始化”