使用push_back()分配时,为什么向量元素的地址不连续?

时间:2013-10-01 23:46:27

标签: c++ vector std stdvector standard-library

请查看下面提供的小测试代码+输出。似乎在循环中对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

1 个答案:

答案 0 :(得分:1)

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

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