C++ 如何使用boost::shared\u ptr构造二叉树

C++ 如何使用boost::shared\u ptr构造二叉树,c++,boost,binary-tree,shared-ptr,C++,Boost,Binary Tree,Shared Ptr,我正在尝试使用boost共享指针来构造二叉树,并将节点存储在STL映射中。我以一个常见的二叉树为例,尝试将指针转换为共享的ptr,如下所示。我可能已经使它比需要的更复杂,因为我认为使用模板将是一个好主意 #include <iostream> #include <string> #include <map> using namespace std; #include "boost/smart_ptr.hpp" //typedef boost::shared

我正在尝试使用boost共享指针来构造二叉树,并将节点存储在STL映射中。我以一个常见的二叉树为例,尝试将指针转换为共享的ptr,如下所示。我可能已经使它比需要的更复杂,因为我认为使用模板将是一个好主意

#include <iostream>
#include <string>
#include <map>
using namespace std;

#include "boost/smart_ptr.hpp"

//typedef boost::shared_ptr<node<int> >  nodePtr;

template <typename T>
class node
{
public:

    T nodeData;
    boost::shared_ptr<node<T> > *left, *right;

    // default constructor. data not initialized
    node() {}

     // initialize the data members
    node (const T& item, 
          boost::shared_ptr<node<T> > lptr = NULL, 
          boost::shared_ptr<node<T> > rptr = NULL) :
          nodeValue(item), left(lptr), right(rptr) {}
};

template <typename T>
void inorderOutput(boost::shared_ptr<node<T> > t)
{
   // the traversal terminates on a empty subtree
   if (t != NULL)
   {
      inorderOutput(t->left);       // descend left
      cout << t->nodeData << ", ";  // output the node
      inorderOutput(t->right);      // descend right
   }
}

int main()
{
    // a few nodes to assemble into a tree
    boost::shared_ptr<node<char> > d( new node<char>('D') );
    boost::shared_ptr<node<char> > e( new node<char>('E') );
    boost::shared_ptr<node<char> > f( new node<char>('F') );
    boost::shared_ptr<node<char> > g( new node<char>('G') );

    boost::shared_ptr<node<char> > b( new node<char>('B',d, e) );
    boost::shared_ptr<node<char> > c( new node<char>('C',f, g) );
    boost::shared_ptr<node<char> > a( new node<char>('A',b, c) );

    // now store the node pointers for later reference
    map<string, boost::shared_ptr<node<char> > > nodeMap;
    nodeMap["D"] = d;
    nodeMap["A"] = a;
    // etc.

    // inorder traversal of nodes  
    cout << "Inorder:      " ;
    inorderOutput(a);
    cout << endl;

    // Test to see if a node has children
    if (( nodeMap["A"]->left != NULL ) || (nodeMap["A"]->right != NULL ) ) 
    {
        cout << "Node A has children!" << endl;
    }

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
#包括“增压/智能水电站”
//typedef boost::shared_ptr nodePtr;
模板
类节点
{
公众:
T nodeData;
boost::shared_ptr*左,*右;
//默认构造函数。数据未初始化
节点(){}
//初始化数据成员
节点(常数和项目),
boost::shared_ptr lptr=NULL,
boost::shared_ptr rptr=NULL):
节点值(项目),左(lptr),右(rptr){}
};
模板
void inordroutput(boost::shared\u ptr t)
{
//遍历在空子树上终止
如果(t!=NULL)
{
顺序输出(t->左);//向左下降
不能右下);//向右下
}
}
int main()
{
//几个节点组合成一棵树
boost::shared_ptr d(新节点('d'));
boost::shared_ptr e(新节点('e'));
boost::shared_ptr f(新节点('f'));
boost::shared_ptr g(新节点('g'));
boost::shared_ptr b(新节点('b',d,e));
boost::shared_ptr c(新节点('c',f,g));
boost::shared_ptr a(新节点('a',b,c));
//现在存储节点指针以供以后参考
地图节点地图;
节点映射[“D”]=D;
节点映射[“A”]=A;
//等等。
//节点的有序遍历
不正确!=空)
{
cout c:\users\john\documents\visual studio 2010\Projects\SharedPtr\Debug\SharedPtr1.exe
2> c:\users\john\documents\visual studio 2010\projects\sharedptr\sharedptr2\sharedptr2.cpp(27):错误C2440:“默认参数”:无法从“int”转换为“boost::shared\u ptr”
2> 与
2>          [
2> T=节点
2>          ]
2> 没有构造函数可以采用源类型,或者构造函数重载解析不明确
2> c:\users\john\documents\visualstudio 2010\projects\sharedptr\sharedptr2\sharedptr2.cpp(49):致命错误C1903:无法从以前的错误中恢复;正在停止编译
显然,节点构造函数没有正确定义。我已经旋转了一段时间,现在试图找出我做错了什么(可能有几件事!)另外,假设我可以编译它,那么对节点子节点的测试会起作用吗?以前的实验让我有理由相信这并不容易。最后,我注释掉了列表顶部的typdef,因为我也没有正确使用它。有人能建议一种方法来清理这段代码吗


John

NULL
会让我在大多数实现中将
#定义为
d为0,看起来猜测
boost::shared\u ptr
不知道该怎么做

改变

boost::shared_ptr<node<T> > *left, *right;
 node (const T& item, 
      boost::shared_ptr<node<T> > lptr = NULL, 
      boost::shared_ptr<node<T> > rptr = NULL) :
      nodeValue(item), left(lptr), right(rptr) {}
 };
boost::shared_ptr*左,*右;

boost::shared_ptr左、右;

节点(常数和项目),
boost::shared_ptr lptr=NULL,
boost::shared_ptr rptr=NULL):

节点(常数和项目),
boost::shared_ptr lptr=boost::shared_ptr(),
boost::shared_ptr rptr=boost::shared_ptr()):

NULL
在大多数实现中,我会将
#定义为
d为0,看起来猜测
boost::shared\u ptr
不知道该怎么做

改变

boost::shared_ptr<node<T> > *left, *right;
 node (const T& item, 
      boost::shared_ptr<node<T> > lptr = NULL, 
      boost::shared_ptr<node<T> > rptr = NULL) :
      nodeValue(item), left(lptr), right(rptr) {}
 };
boost::shared_ptr*左,*右;

boost::shared_ptr左、右;

节点(常数和项目),
boost::shared_ptr lptr=NULL,
boost::shared_ptr rptr=NULL):

节点(常数和项目),
boost::shared_ptr lptr=boost::shared_ptr(),
boost::shared_ptr rptr=boost::shared_ptr()):
更改

boost::shared_ptr<node<T> > *left, *right;
 node (const T& item, 
      boost::shared_ptr<node<T> > lptr = NULL, 
      boost::shared_ptr<node<T> > rptr = NULL) :
      nodeValue(item), left(lptr), right(rptr) {}
 };
节点(常数和项目),
boost::shared_ptr lptr=NULL,
boost::shared_ptr rptr=NULL):
节点值(项目),左(lptr),右(rptr){}
};

节点(常数和项目),
const boost::shared_ptr&lptr=boost::shared_ptr(),
const boost::shared_ptr&rptr=boost::shared_ptr()):
节点值(项目),左(lptr),右(rptr){}
};
如前所述,将“左”和“右”设为非指针增强共享\u ptr。

更改

boost::shared_ptr<node<T> > *left, *right;
 node (const T& item, 
      boost::shared_ptr<node<T> > lptr = NULL, 
      boost::shared_ptr<node<T> > rptr = NULL) :
      nodeValue(item), left(lptr), right(rptr) {}
 };
节点(常数和项目),
boost::shared_ptr lptr=NULL,
boost::shared_ptr rptr=NULL):
节点值(项目),左(lptr),右(rptr){}
};

节点(常数和项目),
const boost::shared_ptr&lptr=boost::shared_ptr(),
const boost::shared_ptr&rptr=boost::shared_ptr()):
节点值(项目),左(lptr),右(rptr){}
};

如前所述,将“左”和“右”设为非指针共享的boost\u ptr。

为什么要保留指向
共享的\u ptr的指针?您清楚它们是如何工作的吗?为什么要保留指向
共享\u ptr
的指针?你清楚它们是如何工作的吗?就是这样,谢谢!我不确定我是否理解您对构造函数默认值所做的操作。lptr=boost::shared_ptr()具体做什么?@JohnSchroeder用默认构造函数构造了一个
boost::shared_ptr
,我猜它给出了一个空指针<代码>boost::shared_ptr()
本质上是对其构造函数的调用。完成了,谢谢!我不确定我是否理解您对构造函数默认值所做的操作。lptr=boost::shared_ptr()具体做什么?@JohnSchroeder用默认构造函数构造了一个
boost::shared_ptr
,我猜它给出了一个空指针<代码>boost::shared_ptr()
本质上是对其构造函数的调用。