2011-05-25 176 views
1

你好 我有以下structSTL容器的默认初始化

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

当我创建新的节点,我也没办法初始化child vector。 我基本上想要的是检查使用operator[]的任何元素是否有有效的值。 我想做以下

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

但是代码在if循环中崩溃。

有没有其他的方法来处理这个问题。

+1

在C++中,'struct node *'中的'struct'是不需要的。 'node *'就够了! – Nawaz 2011-05-25 07:18:13

+0

这些向量是否意味着在运行时具有特定的大小?做孩子[5]和孩子[50]'是否可以吗?或者矢量是否增长,你只需要知道它是否增长超过一点(即位置N的指针不是0,如果它存在的话)? – 2011-05-25 07:20:12

+4

你应该说明你想解决的问题是什么,而不是你的解决方案(或另外)。 – 2011-05-25 07:27:19

回答

4

在这种情况下,你将不得不为你提供一个构造函数struct。

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

这将初始化矢量与10 NULL-指针。然后可以检查索引是否为NULL(表示它不包含数据),或不包含(它确实包含数据)。

+0

但我还没有在子向量中插入任何元素。我想检查指定索引中是否有任何有效的元素。 – Avinash 2011-05-25 07:16:23

+0

在这种情况下,你将不得不做更多的工作。改变你的支票:“if(child。size()> = 6 && child [5])' – RobH 2011-05-25 07:17:58

+0

谢谢,还有一个问题会处理查询第11个或更大的索引元素。 – Avinash 2011-05-25 07:18:25

3

向量有一个构造函数,它需要一个计数和一个值。

vector(
    size_type _Count, 
    const Type& _Val 
); 

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

节点::节点() :孩子(10,NULL){ }

4

的问题不是你的实际问题是什么明确的,那就是无论你需要的矢量在构造后有一个给定的大小,还是只是想检查是否插入了第五个元素。

在第一种情况下,向量的大小是节点类的不变量,您应该在构造过程中强制执行不变量。构造函数添加到node(如其他人所说前):

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

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

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

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

这个条件将验证第一该载体已发展足够(在位置5访问元素,尺寸必须为6或以上),然后是否位置5的元素不为null。请注意,&&会短路,因此如果第一个条件不符合,则第二个条件未测试。

+0

我想要一个容器,我应该能够检查有效元素是否存在于指定的索引处,并且我应该能够在任何索引处插入新的指针,我尝试过使用stl向量。 – Avinash 2011-05-25 07:27:50

+0

@Avinash:正如David已经告诉过你的,这些信息应该是你问题的一部分。 – 2011-05-25 07:30:13

+0

@Avinash,你不能那样做,std :: vector是一个动态大小的容器,即它随着你的需要而增长。在开始的时候它会是空的,当你添加一个项目时(比如说使用'push_back()'方法),它会增长一个,你可以通过'[0]'来访问这个索引等等。要做的事,你需要事先知道它有多少元素,比如100,然后用100个NULL初始化向量。然后你可以访问任何高达100的索引,如果你需要100或更高,那么你需要再次调整大小()。你试图做的事情听起来更像是它需要一张地图,索引作为关键。 – Nim 2011-05-25 07:33:10