共享指针中的递归,而变量在类中定义
Recursion in shared pointers while variable is defined in the class
我有一个简单的问题。我有一个 LinkList 类,根是在类内启动的。
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 功能支持的情况下实现这一点?
除了考虑为什么使用递归搜索(一旦列表变得足够大,很快就会导致堆栈溢出(而不是迭代搜索之外,由于指针是按值传递的,因此不需要p
:只需调用return search_recursiveUtil(root, data)
即可。你的理由是到达列表的末尾是一种误解。
从外部调用搜索时,使用 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);
}
原则上,这正是要走的路:
你的接口函数具有必要的参数,该函数调用具有所需参数的内部函数。这样,您就可以隐藏root
成员变量。您甚至可以/应该将 util 成员函数声明为私有。
相关文章:
- 用C++中的一个变量定义一个常量
- 变量定义到C++布尔值转换
- 未声明的标识符错误,但变量定义正确 (?)
- C++多线程程序:变量定义为类成员的隔离错误
- 将变量定义为静态时,为什么可以多次定义它
- 初始值设定项列表与构造函数赋值与变量定义
- 如何根据传递给函数的变量定义特征矩阵大小
- C++ 描述如何使用来简化变量定义
- 如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
- 是否修改其声明语句中的变量定义良好
- 使用类的其他成员变量定义类的成员变量数组
- 是否可以通过全局变量定义具有可变参数数的函数中的参数数量
- 元组 std::get() 不适用于变量定义的常量
- 全局使用变量定义和C 声明
- C++变量定义中的易失性类型量词位置
- 将变量定义为数组和正确的语法
- 多个,包括具有变量定义的头文件
- 调用构造函数,并将成员作为参数解析为变量定义
- 逗号分隔变量定义中关系前的序列
- 如何使用命名变量定义常量右值引用参数的默认值