C ++ - это язык, основанный на copy семантическом , поэтому, когда вы делаете что-то вроде
Block c = myblocks.at(i);
Вы действительно делаете копию объекта блока. Обратите внимание, что в C ++ жаргон не называется «временным» ... временные выражения в C ++ - это очень специфический термин, означающий неназванные объекты, созданные автоматически и не объявленные.
Это поведение копирования весьма отличается от многих других языков, таких как Python или Java, где вместо этого используется эталонная семантика .
Вы можете попросить не делать копию явно, используя "ссылку" ...
Block& c = myblocks.at(i);
и в этом случае при изменении c
вы работаете с исходным элементом внутри вектора. Обратите внимание, что в этом случае вы должны обратить внимание на то, как долго вы сохраняете свою ссылку, потому что, например, если вы добавляете элемент к вектору, все существующие ссылки и итераторы потенциально становятся недействительными из-за перераспределения векторов, и их использование вызовет ужасную неопределенность. Поведенческий демон.
Если ссылка или итератор признаны недействительными или нет, зависит от типа контейнера, от типа операции, которую вы выполняете над контейнером, и от других фактов, таких как резервирование пространства, поэтому я предлагаю прочитать хорошую книгу по C ++, чтобы понять эти части .
Обратите внимание, что и std::vector::operator []
, и std::vector::at
фактически возвращают ссылку, чтобы ваш код мог также изменить исходный объект в векторе, используя более лаконичный и идиоматический синтаксис
myblocks.at(i).x = 15;