我读到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 开始是连续的吗?(只是为了保持对我之前声明的评论与未来的读者相关。)