[英]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.