繁体   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