STL контейнер по умолчанию инициализация - PullRequest
1 голос
/ 25 мая 2011

Hello У меня есть следующие struct

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

Когда я создаю новый узел, у меня нет возможности инициализировать child vector. По сути, я хочу проверить любой элемент, используя operator[], если есть допустимое значение. Я хочу сделать следующее

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

Но код вылетает в цикле if.

Есть ли другой способ справиться с этим.

Ответы [ 3 ]

4 голосов
/ 25 мая 2011

Вопрос не ясен в том, что является вашей реальной проблемой, то есть нужно ли, чтобы вектор go имел заданный размер после построения или вы просто хотите проверить, был ли вставлен пятый элемент.

В первом случае размер вектора является инвариантом класса узла, вы должны применять этот инвариант во время построения. Добавьте конструктор к node (как уже предлагали другие):

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

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

Если, с другой стороны, размер вектора не является инвариантом, и вы хотите проверить, был ли вставлен пятый элемент и является ли он ненулевым, измените условие if:

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

Это условие сначала проверит, что вектор достаточно вырос (чтобы получить доступ к элементу в позиции 5, размер должен быть 6 или выше), а затем, не является ли элемент в позиции 5 нулевым. Обратите внимание, что && приведет к короткому замыканию, поэтому, если первое условие не выполняется, второе условие не проверяется.

4 голосов
/ 25 мая 2011

В этом случае вам придется предоставить конструктор для вас struct.

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

Это инициализирует вектор с 10 NULL -по указателями.Затем вы можете проверить, является ли индекс NULL (что означает, что он не содержит данных), или нет (он содержит данные).

3 голосов
/ 25 мая 2011

Вектор имеет конструктор, который принимает число и значение.

vector(
   size_type _Count,
   const Type& _Val
);

Используйте это. Определить конструктор для узла:

узел :: узел () : ребенок (10, NULL) { }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...