o std::map::at
função retorna uma referência ao std::vector
no índice dado. Quando você atribui isso a uma variável de não referência, você fará uma cópia do vetor. Quaisquer operações de inserção que você fizer estarão na cópia do vetor, que sai do escopo no final do método, enquanto o vetor que você pretendia ficar apenas no mapa e não é afetado.
Em vez disso, se você adicionar o &
, então vList
Realmente se tornará um pseudônimo do vetor real que é armazenado em seu mapa. Agora, quaisquer alterações feitas para vList
são realmente feitos para o elemento de mapa. Se desejar, você pode considerar a referência como um ponteiro disfarçado. Nesse caso, você escreveria explicitamente
std::vector<Edge> *vList = &edgeList.at(v);
E não, por exemplo,
std::vector<Edge> *vList = new std::vector();
*vList = edgeList.at(v);
Na verdade, o exemplo a seguir demonstra o ponto mais claramente:
using namespace std;
int i = 0;
int& get_i()
{
return i;
}
int main()
{
cout << "i = " << i << ", &i = " << &i << endl;
int j = get_i();
j++;
cout << "i = " << i << ", j = " << j << ", &j = " << &j << endl;
int& k = get_i();
k++;
cout << "i = " << i << ", k = " << k << ", &k = " << &k << endl;
return 0;
}