在std传染媒介,堆和队列的未加工的尖

时间:2013-11-09 20:58:00

标签: c++ c

我遇到了二叉树的问题:

....

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);

std::stack<Node<T>const *> stack; stack.push(root); while(false == stack.empty()) { Node<T>* node = stack.pop(); this->visited(node->value); 之后,当我尝试实施第一次呼吸时: 模板     class BinaryTree     {     私人的:         模板         struct Node         {             T值;             节点*离开;             节点*权利;         };     私人的:         节点* root;

我收到了错误消息:

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

1 个答案:

答案 0 :(得分:5)

问题在于:

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

pop()删除元素并返回void。事先使用top()

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

原始STL documentation解释了此设计背后的原因:

  

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

相关问题