проверить, если индекс вектора пуст - PullRequest
2 голосов
/ 25 января 2012

В моем коде мне нужно сделать это:

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

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

Ответы [ 2 ]

6 голосов
/ 25 января 2012

Перед доступом к edges[j] проверьте, что j < edges.size().

РЕДАКТИРОВАТЬ:

Чтобы проиллюстрировать, что прокомментировал Марк Рэнсом:

if (j < edges.size() && edges[j].ConnectedToNode() != i) //problem line
{
    edges.push_back(Edge(i, j, nodes[i].Position(), nodes[j].Position(), distanceToNode)); 
}
0 голосов
/ 25 января 2012

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

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

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

    edges.resize(j + 1);

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

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