std::vector
всегда хранит копию † того, что вы push_back()
.Поэтому изменение переданного вами значения не повлияет на значение, хранящееся в векторе.Это не похоже на Java или C #, где Object o;
на самом деле является ссылкой на объект, и объект живет до тех пор, пока не придет сборщик мусора и не поднимет его, когда последняя ссылка на него исчезнет.В C ++ Object o;
- это фактический объект , который исчезнет в конце своей области видимости.
Так что, если std::vector
хранит только ссылки на объекты, которые вы push_back()
,тогда это будет совершенно бесполезно для таких вещей:
std::vector<int> numbers;
for(/* loop condition */) {
int number = GetUserInput();
numbers.push_back(n);
}
Поскольку number
исчезнет в конце цикла, numbers
будет содержать ссылки на то, чего не будет, если std::vector
был реализован путем хранения только ссылок.Если std::vector
действительно хранит значения, вы можете получить к ним доступ даже после цикла.
† C ++ 11 поддерживает семантику перемещения , так что если вы«Откат» на самом деле является временным, который скоро уйдет, он будет перемещать внутренности объекта в векторное хранилище вместо копирования.Вы также можете явно использовать C ++ 11 std::move()
, чтобы «форсировать» движение во время push_back()
.Но вектор будет копировать значение в любом другом случае.Это деталь реализации для оптимизации производительности векторов.