c++ - 对 vector 的引用在回退后是否会重新定位?如果是,如何?

标签 c++ vector reference stl

<分区>

我知道当回推超出容量时,C++ STL vector 会重新定位两次分配的空间。我的问题是,如果我有一个 vector 的引用,它在推回后是否仍然有效?

例子如下:

void displayVector(vector<int>& p)
{
    for(auto i:p)
        cout<<i<<" ";
    cout<<endl;
    cout<<"capacity = "<<p.capacity()<<endl<<endl;
}

int main()
{
    vector<int> x(1);
    vector<int>& y=x;

    cout<<"x"<<endl;
    displayVector(x);

    cout<<"y"<<endl;
    displayVector(y);

    for(int i=0;i<100;i++)
        x.push_back(10);    // re- allocation takes place many times

    cout<<"x"<<endl;
    displayVector(x);

    cout<<"y"<<endl;
    displayVector(y);
}

我从上面的程序中得到的结果表明,即使在多次重新分配之后,y 作为对 x 的引用仍然有效。

所以我的问题是:

1) 它会一直发生还是在某些情况下可能会中断?

2) 引用如何在它仍然有效的情况下保持有效,即即使在重新分配之后,在引擎盖下发生了什么以保持引用有效。

最佳答案

无论x<内部发生什么,您对xy 引用将始终保持不变(并且有效)/。因为这就是当 x 由于 pushback 超过 capacity 而必须重新分配内存时发生的情况,内部 指针分配给随着需要更多的顺序(因此位于不同的位置)内存,内存必须改变。

关于c++ - 对 vector 的引用在回退后是否会重新定位?如果是,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34837741/

相关文章:

c++ - 为什么 vector 被视为按值传递,即使它是通过 const 引用传递的?

C++98/03 引用折叠和 cv 限定符

c++ - 如何在范围 for 循环中使用 begin() 和 end()

c++ - 派生 QPainterPath,QPainter 性能快速下降

vector - 三.JS |如何找出两个向量之间的XYZ旋转?

C++ SDL_FreeSurface 在析构函数中崩溃

c++ - 从 C++ 中的外部程序捕获 stderr 和 stdout

c++ - 我怎样才能说服 emacs C++ 模式而不是我的 less 不是模板参数?

math - N维叉积的高效计算?

perl - 当我将 coderef 传递给这个原型(prototype)化的 Perl 子例程时,为什么会出现语法错误?