C ++中的递归容器?

时间:2011-07-01 04:50:01

标签: c++ recursion containers

  

可能重复:
  Are C++ recursive type definitions possible, in particular can I put a vector<T> within the definition of T ?

我最近查看了一些代码并发现了类似于以下内容的数据结构:

class TreeNode {
    std::vector<TreeNode> subNodes;
};

如您所见,在定义TreeNode之前,使用TreeNode实例化容器。代码在GCC和MSVC下编译,但我记得看到有人说这不是保证行为。遗憾的是,我根本无法在标准中找到任何内容。

这些容器如何实施?标准是否保证了这种行为?如果标准不能保证这一点,我对这种设计有什么选择?

1 个答案:

答案 0 :(得分:2)

这很好,因为std::vector<T>类中不包含任何类型T的具体实例:它通常使用指针实现。模板实例化std::vector<TreeNode>不需要TreeNode的完整定义。

std::vector<T>通常作为指针的三元组实现(虽然标准不要求这样做):

template <typename T>
class vector
{
  ...
  T* start;
  T* end;
  T* end_of_storage;
};

如果std::vector<T> 包含T的具体实例,那么您就会遇到问题。以下不是合法的C ++,因为它创建了一个圆形的“有一个”定义:

template <typename T>
class container
{
  T x;
};

class TreeNode
{
  container<TreeNode> subNodes;
};