Я читал, что 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
является непрерывным контейнером и почему его элементы перемещаются? Может быть, они хранят их вместе, но перемещают их все вместе, когда требуется больше места?
Edit: Является ли std::vector
смежным только с С++ 17? (Просто чтобы оставить комментарии к моему предыдущему утверждению актуальными для будущих читателей.)