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);
我插入并添加额外的元素后,整个向量可能会转移到不同的内存位置?C++引用是否像宏替换一样工作?
那么r0和p0会返回什么?
如果向量已经移动我猜p0会指向垃圾,但参考是否仍然有效(即返回0)?是否类似于宏替代的参考?
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);
我插入并添加额外的元素后,整个向量可能会转移到不同的内存位置?C++引用是否像宏替换一样工作?
那么r0和p0会返回什么?
如果向量已经移动我猜p0会指向垃圾,但参考是否仍然有效(即返回0)?是否类似于宏替代的参考?
引用不像是宏替换。
任何增加std::vector
大小的操作都会使其迭代器的end()
无效。如果调整大小也增加了向量的容量(即重新分配底层内存),迭代器也会失效。
这意味着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()
等)管理的数据的特征将会(可能)改变。
谢谢彼得。我认为这是在引用我的描述中使用了“别名”这个词。 – NoComprende
宏替代与其他任何东西都完全不同。您的代码将创建一个悬挂参考 –
矢量本身'v'永远不会移动。 – molbdnilo
你确定molbdnilo吗? http://www.cplusplus.com/reference/vector/vector/ states“在内部,矢量使用一个动态分配的数组来存储它们的元素。这个数组可能需要重新分配,以便在插入新元素时增加大小,这意味着分配一个新的数组并将所有的元素移动到它上面,这在处理时间方面是一个相对昂贵的任务,因此每次向容器添加一个元素时矢量都不会重新分配。 – NoComprende