gpt4 book ai didi

c++ - 我应该避免在现代 C++ 中引用指针还是在这种特殊情况下可以

转载 作者:行者123 更新时间:2023-11-30 01:03:11 25 4
gpt4 key购买 nike

我知道现代 C++ 中的原始指针(或更准确地说 newdelete)必须避免,除非确实需要。我相信在图形实现方面,指针非常有用。不过,我很乐意听到对此的评论。

我正在研究二叉搜索树并编写 insert 函数。我使用两种不同但相似的方法实现,一种使用指针,另一种使用对指针的引用。显然我想更改指针本身(ref to ptr)。想知道它们中的任何一个是否有优势或者不应该使用并且必须使用 const 引用或智能指针(现代方式)编写。

Node *insert_ptr(Node *root, int data)
{
if (root == NULL)
return create(data);
else if (data < root->data)
root->left = insert(root->left, data);
else
root->right = insert(root->right, data);
return root;
}

void insert_ref_to_ptr(Node *&root, int data)
{
if (root == NULL)
root = create(data);
else if (data < root->data)
insert(root->left, data);
else
insert(root->right, data);
}

如果您想运行,我将在下面提供其余代码。您可能希望使用 1 3 6 8 10 14 13 4 7 作为输入

struct Node
{
int data;
Node *left;
Node *right;
};

void display(Node *root)
{
if (root != NULL)
{
display(root->left);
cout << root->data << " ";
display(root->right);
}
}

Node *create(int data)
{
Node *node = new Node();
node->data = data;
node->left = node->right = NULL;
return node;
}

int main()
{
Node *root = NULL;
vector<int> nodes;

string line;
int value;
getline(cin, line);
stringstream split(line);
while (split >> value)
nodes.push_back(value);
/*
root = insert_ptr(root, nodes[0]);
for (int i = 1; i < nodes.size(); i++)
insert_ptr(root, nodes[i]);
*/

for (int i = 0; i < nodes.size(); i++)
insert_ref_to_ptr(root, nodes[i]);
display(root);
return 0;
}

最佳答案

在现代 C++ 中必须避免使用指针,除非确实需要 这是错误的。

应避免使用

newdelete,而应该使用唯一和共享指针。

但如果您不转移所有权,您仍将通过引用或原始指针传递对象。

你的 Node 有一个所有权关系,所以它应该是:

struct Node
{
int data;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
};

struct Node
{
int data;
std::shared_ptr<Node> left;
std::shared_ptr<Node> right;
};

您的display 函数不需要所有权,因此您将节点作为指针(或引用)传递

void display(Node *root)
{
if (root != nullptr)
{
display(root->left);
cout << root->data << " ";
display(root->right);
}
}

因为您不打算更改它,所以我会使用 const ref:

void display(const Node &root)
{
if(root.left != nullptr) {
display(*root.left);
}

cout << root.data << " ";

if(root.right != nullptr) {
display(*root.right);
}
}

insert_ref_to_ptr 是一个非常糟糕的结构,因为不清楚它是否转移了任何所有权,也不清楚它调用了 create(data) 在其中创建使用 new 的节点。

创建看起来像这样:

std::unique_ptr<Node> create(int data)
{
auto node = std::make_unique<Node>();
node->data = data;
return std::move(node);
}

insert_ref_to_ptr 函数类似于:

void insert_ref_to_ptr(std::unique_ptr<Node> &root, int data)
{
if (root == nullptr)
root = std::move(create(data));
else if (data < root->data)
insert(root->left, data);
else
insert(root->right, data);
}

关于c++ - 我应该避免在现代 C++ 中引用指针还是在这种特殊情况下可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54506580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com