2012-01-25 3 views
2

В моем коде, я должен сделать это:проверка, чтобы увидеть, если вектор индекс пуст

if (edges[j].ConnectedToNode() != i) //problem line 
{ 
    edges.push_back(Edge(i, j, nodes[i].Position(), nodes[j].Position(), distanceToNode)); 
} 

однако, есть вероятность того, что края [у] пока не существует. как я могу проверить это, чтобы избежать и индексировать исключение вне диапазона? (Это связано с узлами пути, по сути, если есть ребро, соединяющее J к I, я не хочу, чтобы добавить еще от I до J

+0

Похоже, что вы смешиваете индексы. Вы используете j как индекс для ребер, а также как индекс для узлов. push_back добавит копию объекта Edge, который вы создаете, в массив ребер. Это не обязательно будет идти в j-й индекс. Подумайте об использовании библиотеки boost :: graph. –

+0

вы абсолютно правы, я в середине обновления моего кода, и ребра меняются от вектора к вектору карт от индексов к ребрам. – SirYakalot

ответ

6

Перед обращением edges[j] проверить, что j < edges.size()

EDIT..:

Для того, чтобы проиллюстрировать, что прокомментировал Марк Ransom:

if (j < edges.size() && edges[j].ConnectedToNode() != i) //problem line 
{ 
    edges.push_back(Edge(i, j, nodes[i].Position(), nodes[j].Position(), distanceToNode)); 
} 
+3

Вот где короткозамкнутое поведение '&&' и '|| 'пригодится - вы можете поставить эту проверку сначала в оператор' if', а вторая часть не будет выполнена, поэтому нет возможности получить доступ за пределами диапазона. –

+0

@MarkRansom очень умный! Спасибо за это. – SirYakalot

0

Вы можете сделать это, проверяя размер вектора:

if(edges.size() <= i) // will be false if i is too large 

Если это так, то вы должны изменить размер вектора:

edges.resize(j + 1); 

В зависимости от плотности вашего смежности-списка, вы получите очень разреженный вектор (не будет использоваться в большинстве записей). В этом случае вам следует рассмотреть возможность использования std::map<int, int> или что-то в этом роде. Это имеет то преимущество, что карта автоматически создает новый индекс, если для данного ключа не существует.

+0

Почему мне нужно изменить размер вектора? – SirYakalot

+0

Я думал, что ваша формулировка * "еще не существует ** ** ** * указала, что вы хотите создать запись, если она не существует. Кажется, я неверно истолковал. –

Смежные вопросы