Меняем вещи из вектора - PullRequest
       7

Меняем вещи из вектора

1 голос
/ 29 октября 2010

Какой самый простой способ извлечь что-либо из вектора и изменить его значения?Это не работает так, как я ожидал.

for(int i = 0; i < list.size(); i++) {
someType s = list.at(i);
s.x = 10;
s.y = 20;
s.z = 30;
}

Однако, когда я иду распечатывать x, y, z этого типа, это не дает мне того, что я ожидаю.Извините, я смешиваю Java и C ++.

Ответы [ 4 ]

9 голосов
/ 29 октября 2010
someType s = list.at(i);

Вы делаете копию элемента с индексом i. В C ++, если вы хотите ссылку на что-то, вам нужно явно указать, что вы хотите ссылку:

someType& s = list.at(i);
     // ^ I'm a reference

Как написано сейчас, вы управляете только созданной копией, а не объектом в контейнере.

4 голосов
/ 29 октября 2010

В стандартной библиотеке C ++ нет "ArrayList". Я предполагаю, что вы используете std::vector, std::vector<someType>, если быть точным.

Контейнеры STL хранят объекты по значению . Первая строка в этом теле цикла вызывает someType конструктор копирования , поэтому вы получите копию объекта. Эта копия автоматически выделяется , т.е. она находится в стеке. Вы обновляете копию, а затем она выходит из области видимости и уничтожается в конце итерации. Исходный объект, содержащийся в векторе, не изменяется.

Edit:

И, конечно, я забыл сделать последнее замечание - используйте ссылку (см. Ответ Джеймса, который вы, вероятно, должны принять).

2 голосов
/ 29 октября 2010

Скорее всего, вы копируете значения. Как определяется список? список объектов или список указателей на объекты? Обязательно используйте & как «ссылку» на элемент списка.

T& s = list.at(i);
s.x = 0;
s.y = 1;
0 голосов
/ 29 октября 2010

Вы копируете значения;каждый объект копируется с использованием его конструктора копирования [по умолчанию].

Если вы хотите более легко ссылаться на элементы списка, вы должны использовать reference s:

for(int i = 0; i < list.size(); i++) {
someType& s = list.at(i);
//      ^ This is a reference
s.x = 10;
s.y = 20;
s.z = 30;
}

Вы можете рассматривать эту ссылку как «псевдоним» для элемента списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...