-3

所以我看到了这个问题,它基本上说引用和迭代器一起失效。

我明白为什么在某些情况下迭代器无效,但为什么引用无效

从实际的角度来看,我不明白为什么需要这样做。

这只是一个设计决定还是有一些实际原因?

编辑:澄清一下,据我了解底层结构,它只是指向需要重新分配的数据的指针(数据(以及对它的引用)可以保持不变)。对?

一些测试代码:

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<string> yourVect;
    yourVect.push_back("def");
    vector<string>::iterator iter = yourVect.begin();
    const string& ref = *iter;
    yourVect.insert(yourVect.begin(), "abc");
    cout << ref << endl; // !! --- doesn't work - why ?? --- !!
    cout << *iter << endl; // obviously doesn't work
}
4

1 回答 1

4

如果您在向量的开头插入一个字符串,则所有数据都必须向前移动一个位置,并且如果容量vector耗尽,vector则必须重新分配。

因此,最好的情况是引用现在引用不同的数据,最坏的情况是引用无效的内存位置:如果向量重新分配,则分配一个新的内存块,旧数据复制1到新块中,旧块被解除分配;由于所有旧引用都指向旧块内的内存位置,因此它们都将无效。

保证涉及“最坏情况”,这就是为什么不保证在insert操作后引用仍然有效的原因。或者,换一种说法,向量中的插入可能会使迭代器和引用无效。

另外,我不明白为什么您认为引用和迭代器之间的这种行为存在很大差异 -vector迭代器通常只是指向被引用vector位置的指针(通常隐藏在实现定义的类中),所以它或多或少是与参考相同。


  1. C++11 中的 IIRC 实际上是“移动”的(如std::move);这不会改变旧引用将继续指向然后释放的内存的事实。
于 2013-02-23T21:20:52.680 回答