А std::map::at
функция возвращает ссылку на std::vector
в данном индексе. Когда вы назначаете это не ссыльной переменной, вы будете делать копию вектора. Любые операции вставки, которые вы выполняете, будут в копии вектора, которая выйдет из объема в конце метода, в то время как вектор, к которому вы стремились, просто сидит на карте счастливо и не затронута.
Вместо этого, если вы добавите &
, тогда vList
действительно станет псевдонимом фактического вектора, который хранится на вашей карте. Теперь любые изменения, внесенные в vList
действительно сделаны в элементе карты. Если хотите, вы можете посмотреть на ссылку в качестве замаскированного указателя. В этом случае вы явно напишите
std::vector<Edge> *vList = &edgeList.at(v);
и нет, например,
std::vector<Edge> *vList = new std::vector();
*vList = edgeList.at(v);
На самом деле, следующий пример демонстрирует эту точку зрения более четко:
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;
}