【发布时间】:2017-05-21 21:24:24
【问题描述】:
我有一个如下所示的结构:
struct TreeNode
{
int value;
std::unique_ptr<TreeNode> left = nullptr, right = nullptr;
};
对于这样的树实现,我想使用unique_ptr 比使用shared_ptr 更好,对吧?
然后我在priority_queue中放了几个节点,比如这样:
bool operator<(const TreeNode& t1, const TreeNode& t2)
{
return t1.value < t2.value;
}
...
std::priority_queue<TreeNode> nodes;
for(int i = 0; i < 10; i++)
{
TreeNode node;
node.value = i;
nodes.push(node);
}
在那之后,unique_ptr 的问题出现在我必须做这样的事情时:
TreeNode n1 = nodes.top();
nodes.pop();
TreeNode n2 = nodes.top();
nodes.pop();
TreeNode node;
node.value = n1.value * n2.value;
node.left = std::unique_ptr<TreeNode>(new TreeNode(n1));
node.right = std::unique_ptr<TreeNode>(new TreeNode(n2));
此代码显然不起作用,但我想知道如何使其尽可能简单地工作。
我设法通过从 Internet 获得的 make_unique 实现做了一些事情,但这太临时了。我也尝试过使用std::move 和std::forward,但没有成功。
此外,我以后必须做这样的事情:
std::unique_ptr<TreeNode> root(new HuffmanTreeNode(my_root));
std::unique_ptr<TreeNode> current_node = node;
while(current_node)
{
current_node = current_node->left;
}
再一次,它显然不起作用,但我不知道如何使它正常工作。 (算法也是废话,只是为了说明我的问题)
您能举个例子,告诉我如何在这里完成吗?也许有某种方法可以将unique_ptr 转换为shared_ptr,然后进行反向操作?
【问题讨论】:
-
std::unique_ptr不可复制,故事结束。如果你想让你的结构可复制,那么你不能使用std::unique_ptr。或者您需要考虑另一种不需要复制您的结构的设计。 -
没错,这不是我真正想做的。我修改了我的标题。我想用
shared_ptr实现树形结构是不行的,但我想还是有办法做我需要做的操作。 -
这取决于您要放入队列的节点是否附加到树上。如果没有,您可能需要
priority_queue<unique_ptr<TreeNode>>,或者将树数据与树节点分开并拥有priority_queue<TreeData>。
标签: c++ pointers unique-ptr