std::vector<int> v;
v.push_back(1);
int &r0=v[0],*p0=&v[0];
v.insert(v.begin(),0);
for (int i=2; i<1000000; i++) v.push_back(i);
在我插入并添加其他元素后,整个矢量可能会转移到不同的内存位置吗?
那么r0和p0会返回什么?
如果向量已经移位我猜测p0会指向垃圾但参考仍然有效(即返回0)?是一个类似于宏替换的引用?
答案 0 :(得分:1)
引用与宏替换完全不同。
任何增加std::vector
大小的操作都会使其end()
迭代器无效。如果调整大小也会增加向量的容量(即重新分配底层内存),begin()
迭代器也会失效。
这意味着r0
和p0
都可能无效。如果没有在调整大小之前和之后检查并比较v.capacity()
的结果(并确认容量没有变化),则无法保证r0
和p0
引用或指向第一个元素向量v
。
用于更新向量大小和容量的策略是实现定义的。鉴于您的代码插入了一百万个元素(1000001
),很可能在某个时刻容量增加,并且r0
和p0
都无效(即(实际上,很少有std::vector
的实现会使用一种策略,在添加这些元素时不需要调整大小。所以,实际上,r0
和p0
都是无效的,这是公平的赌注。
向量的地址(即&v
)不会改变。由v
(v.capacity()
,v.size()
,v.data()
,v.begin()
,v.end()
等管理的数据的特征将会(可能)发生变化