【发布时间】:2012-02-02 23:59:17
【问题描述】:
假设我有一个整数向量,
std::vector<int> numbers;
填充了一堆值,然后我说这样做(在 43 处存在条目)
int *oneNumber = &numbers[43];
是否保证 oneNumber 始终指向索引 43 处的 int,即使说我将数字调整为 numbers.resize(46) 之类的东西?
我不能 100% 确定这里的预期行为是什么,我知道向量可以保证是连续的,但不确定这种连续性是否也意味着向量中的所有索引在其整个生命周期中都将保持在同一个位置。
【问题讨论】:
-
出于这个原因,我总是对创建值类型的向量持谨慎态度,因为我不可避免地需要一个指向向量内对象的指针。所以我保存了一个参考,如
int* ref = &numbers[43].. 稍后将几个push_backs 放入numbers和WHAMMO! Bug:ref无效,因为numbers已被完全重新分配并保存在完全不同的内存空间中。 -
@bobobobo 非常正确。尽管对于在创建时元素数量已知的情况(不,我不能使用
std::array,因为我emplace-通过循环构造值),reserve保证所有指针/迭代器都进入向量将保持有效,只要它的大小没有超出其当前容量(这可能会强制重新分配并因此移动包含值的地址)。这救了我几次,但每一次我都忘记reserve,然后挠头一段时间,直到我想起来。 :D