1

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

1 回答 1

1

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

MyVec.reserve(10);
for (int i = 0; i < 10; i++)
{
    MyVec.push_back(i);
    //...
于 2013-10-01T23:52:19.307 回答