STL容器默认初始化

时间:2011-05-25 07:13:43

标签: c++ stl

您好 我关注struct

struct node {
   std::string word
   std::vector<struct node *> child;
}

当我创建新节点时,我无法初始化child vector。 我真正想要的是使用operator[]检查任何元素是否有有效值。 我想做以下

if ( nodeptr->child[5] )  {
}

但是代码在if循环时崩溃了。

还有其他方法可以解决这个问题。

3 个答案:

答案 0 :(得分:4)

在这种情况下,您必须为您的struct提供构造函数。

struct node {
   node() : word(), child(10, NULL) {}
   std::string word
   std::vector<struct node *> child;
}

这将使用10个NULL指针初始化向量。然后,您可以检查索引是否为NULL(意味着它不包含数据),或者不是(它确实包含数据)。

答案 1 :(得分:4)

问题不明确你的实际问题是什么,即你是否需要在构造之后使用给定大小的矢量或者你是否只想检查是否插入了第五个元素。

在第一种情况下,向量的大小是节点类的不变量,您应该在构造期间强制执行不变量。将构造函数添加到node(正如其他人之前建议的那样):

struct node {
   static const int NUM_CHILDREN = 10;
   std::string word;
   std::vector<node*> child;

   node() : word(), child( NUM_CHILDREN ) {}
};

另一方面,如果向量的大小不是一个不变量,并且您想检查是否插入了第五个元素以及它是否为非null,则更改if条件:

if ( nodeptr->child.size() > 5 && nodeptr->child[5] ) {

该条件将首先验证向量是否已经增长(访问位置5处的元素,大小必须为6或更大),然后是否位置5处的元素不为空。请注意&&会短路,因此如果不满足第一个条件,则不会测试第二个条件。

答案 2 :(得分:3)

Vector有一个构造函数,它接受一个计数和一个值。

vector(
   size_type _Count,
   const Type& _Val
);

使用它。为节点定义构造函数:

节点::节点() :child(10,NULL) { }