Ваша проблема неуловима, но связана с q.push(&nb[i])
.То, что вы делаете, это добавление указателя на местоположение в векторе, которое концептуально не то же самое, что добавление указателя на объект MyVertex
.Вектор соседей содержит MyVertex
объекты «по значению» (если это помогает вам понять проблему).
Просмотр nb
в памяти может помочь:
0 1 I
nb [MyVertex0|MyVertex1| ... |MyVertexI]
+---------+
| (Notice it is NOT pointing to MyVertex1!)
&nb[1]------------+
Когда вы нажимаете &nb[1]
, вы нажимаете адрес nb + (1 * sizeof(MyVertex))
.nb
объявлено в стеке, так что адрес будет где-то в стеке.
Поэтому, когда ваш for
-петл возвращается, nb
обновляется (так сказать) иновые данные добавлены.Однако ваша очередь q
содержит адреса в nb
, которые больше не действительны!
Проще говоря: ваша очередь ссылается на LOCATION в векторе, а не на DATA в векторе .
Если вы хотите оставить свой метод как есть, это означает, что getNeighbors
необходимо изменить, чтобы он возвращал вектор MyVertex*
.
Вы должны просто отредактировать BreadthFirstSearch
, чтобы взять два MyVertex&
, а не указатели.Затем вы должны изменить q
на queue<MyVertex>
, v
на MyVertex
, и, наконец, вы должны изменить q.push(&nb[i])
на q.push(nb[i])
.