Я читал, что std::vector
должно быть смежным. Насколько я понимаю, его элементы должны храниться вместе, а не распределяться по памяти. Я просто принял этот факт и использовал эти знания, когда, например, использовал метод data()
, чтобы получить основной непрерывный фрагмент памяти.
Однако я столкнулся с ситуацией, когда память вектора ведет себя странным образом:
std::vector<int> numbers;
std::vector<int*> ptr_numbers;
for (int i = 0; i < 8; i++) {
numbers.push_back(i);
ptr_numbers.push_back(&numbers.back());
}
Я ожидал, что это даст мне вектор некоторых чисел и вектор указателей на эти числа. Однако при перечислении содержимого указателей ptr_numbers
появляются разные и, казалось бы, случайные числа, как будто я обращаюсь к неправильным частям памяти.
Я пытался проверять содержимое каждый шаг:
for (int i = 0; i < 8; i++) {
numbers.push_back(i);
ptr_numbers.push_back(&numbers.back());
for (auto ptr_number : ptr_numbers)
std::cout << *ptr_number << std::endl;
std::cout << std::endl;
}
Результат выглядит примерно так:
1
some random number
2
some random number
some random number
3
Похоже, что когда я push_back()
к numbers
вектору, его более старые элементы меняют свое местоположение.
Так, что именно означает, что std::vector
является смежным контейнером и почему его элементы перемещаются? Может быть, он хранит их вместе, но перемещает их все вместе, когда требуется больше места?
Редактировать: std::vector
является смежным только после C ++ 17? (Просто чтобы комментарии к моей предыдущей заявке были актуальны для будущих читателей.)