为什么使用 push_back() 赋值时向量元素的地址不连续



请查看下面提供的小测试代码+输出。似乎在循环中的 std::vector 上使用 push_back(( 时,C++在"随机"地址分配内存,然后在循环完成后将数据重新复制到连续的内存地址中。

这与在循环之前未知向量大小的事实有关吗?

在测试代码中执行操作的正确方法是什么?在第一个循环退出后,我是否必须在另一个循环中分配指针?请注意,我无法在第一次循环之前定义向量的大小,因为实际上它实际上是需要初始化的类对象的向量。

谢谢你的帮助。

std::vector<int> MyVec;
std::vector<int *> MyVecPtr;
for (int i = 0; i < 10; i++)
{
    MyVec.push_back(i);
    MyVecPtr.push_back(&MyVec.back());
    std::cout << MyVec.back() << " " 
              << &MyVec.back() << " "
              << MyVecPtr.back() << " "
              << *MyVecPtr.back() << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < MyVec.size(); i++)
{
    std::cout << MyVec[i] << " " 
              << &MyVec[i] << " "
              << MyVecPtr[i] << " "
              << *MyVecPtr[i] << std::endl;
}

0 0x180d010 0x180d010 0
1 0x180d054 0x180d054 1
2 0x180d038 0x180d038 2
3 0x180d03c 0x180d03c 3
4 0x180d0b0 0x180d0b0 4
5 0x180d0b4 0x180d0b4 5
6 0x180d0b8 0x180d0b8 6
7 0x180d0bc 0x180d0bc 7
8 0x180d140 0x180d140 8
9 0x180d144 0x180d144 9
0 0x180d120 0x180d010 25219136
1 0x180d124 0x180d054 0
2 0x180d128 0x180d038 2
3 0x180d12c 0x180d03c 3
4 0x180d130 0x180d0b0 4
5 0x180d134 0x180d0b4 5
6 0x180d138 0x180d0b8 6
7 0x180d13c 0x180d0bc 7
8 0x180d140 0x180d140 8
9 0x180d144 0x180d144 9

如果您知道要执行多少次插入,则应相应地在vector上使用reserve()。这将消除在超出容量时执行的任何大小调整的需要。

MyVec.reserve(10);
for (int i = 0; i < 10; i++)
{
    MyVec.push_back(i);
    //...

最新更新