0

我对二叉树有以下问题:

....

template class BinaryTree { private: template struct Node { T value; Node* left; Node* right; }; private: Node* root;

std::stack<Node<T>const *> stack;

stack.push(root);

while(false == stack.empty())
{
    Node<T>*  node = stack.pop();

    this->visited(node->value);

之后,当我尝试实现呼吸优先搜索时:模板类 BinaryTree { private: template struct Node { T value; 左节点*;节点* 对;}; 私人:节点*根;

std::stack<Node<T>const *> stack;

stack.push(root);

while(false == stack.empty())
{
    Node<T>*  node = stack.pop();

    this->visited(node->value);

我收到一个错误:

错误 4 错误 C2440: 'initializing' : 无法从 'void' 转换为 'BinaryTree::Node *' c:\users\stephan\documents\visual studio 2012\projects\graphs\binarytree\binarytree.cpp 152 1 BinaryTree

4

1 回答 1

5

问题在这里:

Node<T>*  node = stack.pop();

pop()移除元素并返回voidtop()事先使用。

Node<T>*  node = stack.top();
stack.pop();

原始STL 文档解释了这种设计背后的原因:

有人可能想知道为什么 pop() 返回 void,而不是 value_type。也就是说,为什么必须使用 top() 和 pop() 来检查和删除顶部元素,而不是将两者组合在一个成员函数中?事实上,这种设计是有充分理由的。如果 pop() 返回顶部元素,它必须按值而不是按引用返回:按引用返回会创建一个悬空指针。然而,按值返回是低效的:它涉及至少一个冗余的复制构造函数调用。由于 pop() 不可能以既高效又正确的方式返回值,所以更明智的是它根本不返回值并要求客户端使用 top() 来检查值栈顶。

于 2013-11-09T20:59:07.403 回答