簡體   English   中英

標准向量,堆棧和隊列中的原始指針

[英]Raw pointer in a std vector, stack and queue

我對二叉樹有以下問題:

....

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:模板struct Node {T值; 節點*左; 節點*正確; }; 私有:節點*根;

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

問題在這里:

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

pop()刪除元素並返回void 預先使用top()

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

原始STL文檔解釋了此設計背后的原因:

有人可能想知道為什么pop()返回void而不是value_type。 也就是說,為什么必須使用top()和pop()來檢查並刪除top元素,而不是將兩者組合在一個成員函數中? 實際上,這種設計是有充分理由的。 如果pop()返回頂部元素,則必須按值而不是按引用返回:按引用返回將創建一個懸空指針。 但是,按值返回效率低下:它涉及至少一個冗余副本構造函數調用。 由於pop()不可能以有效且正確的方式返回值,因此更明智的做法是根本不返回任何值,並要求客戶端使用top()在以下位置檢查該值堆棧的頂部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM