2017-06-06 58 views
-5
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)?是否类似于宏替代的参考?

+3

宏替代与其他任何东西都完全不同。您的代码将创建一个悬挂参考 –

+0

矢量本身'v'永远不会移动。 – molbdnilo

+0

你确定molbdnilo吗? http://www.cplusplus.com/reference/vector/vector/ states“在内部,矢量使用一个动态分配的数组来存储它们的元素。这个数组可能需要重新分配,以便在插入新元素时增加大小,这意味着分配一个新的数组并将所有的元素移动到它上面,这在处理时间方面是一个相对昂贵的任务,因此每次向容器添加一个元素时矢量都不会重新分配。 – NoComprende

回答

1

引用不像是宏替换。

任何增加std::vector大小的操作都会使其迭代器的end()无效。如果调整大小也增加了向量的容量(即重新分配底层内存),迭代器也会失效。

这意味着r0p0都可能失效。如果没有在调整大小前后检查并比较v.capacity()的结果(并确认容量没有变化),则不保证r0p0引用或指向载体v的第一个元素。

用于更新矢量大小和容量的策略是实现定义的。考虑到你的代码插入了一百万个和一个元素(1000001),很可能容量在某个点上增加了,并且r0p0都是无效的(即,留下了悬挂) - 实际上,很少有std::vector的实现会使用在添加该数量的元素时不需要调整大小的策略。所以,实际上,r0p0都是无效的。

该向量的地址(即&v)不会改变。由vv.capacity(),v.size(),v.data(),v.begin(),v.end()等)管理的数据的特征将会(可能)改变。

+0

谢谢彼得。我认为这是在引用我的描述中使用了“别名”这个词。 – NoComprende

相关问题