我找不到任何实际用途,但我仍然很好奇为什么在相同的语句作用域中运行时与不同的语句作用域中运行时会得到不同的结果?
int num = 3;
vector<int> ivec;
vector<int*> ipvec;
for (int i = 0; i != num; ++i)
{
ivec.push_back(i);
ipvec.push_back(&ivec[i]);
}
for (int i = 0; i != num; ++i)
{
cout << "ivec:\t" << ivec[i] << endl;
cout << "ipvec:\t" << *ipvec[i] << endl;
}
ivec: 0
*ipvec: -572662307
ivec: 1
*ipvec: -572662307
ivec: 2
*ipvec: 2
int num = 3;
vector<int> ivec;
vector<int*> ipvec;
for (int i = 0; i != num; ++i)
ivec.push_back(i);
for (int i = 0; i != num; ++i)
ipvec.push_back(&ivec[i]);
for (int i = 0; i != num; ++i)
{
cout << "ivec:\t" << ivec[i] << endl;
cout << "*ipvec:\t" << *ipvec[i] << endl;
}
ivec: 0
*ipvec: 0
ivec: 1
*ipvec: 1
ivec: 2
*ipvec: 2
因此 std::vector 根据输入分配内存并调整大小。因此,在变体 1 中,您跨越了第一个分配大小(在本例中为 2)。因此, [0] 和 [1] 的指针不再有效,因为向量内的数组已被重新分配,现在具有不同的地址。在变体 2 中,您不会遇到此问题,因为您已经分配了向量的完整列表,因此您添加的所有指针都是有效的。这不是范围的问题,而是从事实来看,当列表增长时,std::vector 会按某个常数因子分配内部增长数组(例如 2,因此大小为 2,然后是 4,然后是 8 等)。 (这就是为什么 [2] 在两次迭代中都有效(因为内部数组最后的大小为 4)。