Один вопрос о векторном push_back - PullRequest
3 голосов
/ 11 марта 2010

Я только что заметил, что для вектора push_back это обратная ссылка на элемент.

void push_back ( const T& x );

У меня вопрос: изменилась ли структура памяти после push_back?

Например, сначала у меня есть массив, который содержит пять элементов, и макет выглядит следующим образом.

|          |          |          |          |          |              
|   A1     |     A2   |   A3     |    A4    |    A5    |

Теперь у меня есть вектор v

v.push_back(A3)

Теперь, как выглядит память?

Как вектор хранит элементы здесь?

Как вектор обращается к элементу?

Ответы [ 4 ]

6 голосов
/ 11 марта 2010

Вектор сохраняется по значению, а не по ссылке .

При повторном добавлении того же элемента копия будет сохранена в конце. Если вы не хотите копировать значения, которые вы вставляете в vector, вам следует вместо этого использовать указатели.

Пример:

std::vector<std::string> v;
string s = "";
v.push_back(s);
s = "hi";
v.push_back(s);

v теперь содержит 2 разных элемента, один с пустой строкой и один со строкой, содержащей "hi". Обе строки в векторе остаются независимыми от s.

Примечание: внутренние детали реализации контейнера STL могут различаться, нет гарантии, что он будет реализован определенным образом; однако семантика того, как работает контейнер STL, останется неизменной независимо от внутренней реализации.

3 голосов
/ 11 марта 2010

Теперь, как выглядит память? и Как вектор хранит элементы здесь?

Есть два возможных результата:

  1. Блок памяти вектора недостаточно велик для размещения элементов, поэтому основная память перераспределяется. Объекты копируются (используя их конструкторы копирования) в их новые местоположения. Затем объект push_back 'копируется (по значению) в конец.
  2. Блок памяти вектора достаточно большой, новые элементы копируются (по значению) в конец.

Как вектор обращается к элементу?

Так же, как вы обращаетесь к массиву в стиле C. BasePointer + index

2 голосов
/ 11 марта 2010

vector::push_back принимает ссылку, а затем читает значение ссылки, чтобы скопировать его в вектор.

Таким образом, результирующий вектор будет

| A3 |

Обратите внимание, что при изменении размера вектора в соответствии с новыми данными, он может переместить старые данные в новое место, лишив их прежних ссылок. Так что если список А1, А2,… A5 равен v,

v.push_back(A3)

сделает недействительным A3, поскольку A3 ссылается на данные внутри v. Единственный способ сохранить дескриптор данных внутри вектора по мере его роста - сохранить индекс; ссылки, указатели и итераторы не подойдут.

0 голосов
/ 11 марта 2010
|   A1     |     A2   |   A3     |    A4    |    A5    |   A3     |

Элементы (как и все в STL) хранятся по значению.

Векторы обращаются к элементам так же, как встроенные массивы.

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