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

その後、ブレスファースト検索を実装しようとしたとき: template class 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: '初期化中': '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() が value_type ではなく void を返すのか不思議に思うかもしれません。つまり、1 つのメンバー関数で 2 つを組み合わせるのではなく、top() と pop() を使用して最上位の要素を調べて削除する必要があるのはなぜでしょうか? 実は、このデザインにはちゃんとした理由があります。pop() が最上位の要素を返す場合、参照ではなく値で返す必要があります。参照で返すと、ダングリング ポインターが作成されます。ただし、値による戻りは非効率的です。少なくとも 1 つの冗長なコピー コンストラクター呼び出しが含まれます。pop() が効率的かつ正確な方法で値を返すことは不可能であるため、値をまったく返さず、クライアントに top() を使用して値を検査するよう要求する方が賢明です。スタックの一番上。

于 2013-11-09T20:59:07.403 に答える