将 std::vector 收缩以适应对向量本身的引用无效

Would std::vector shrink to fit invalidate a reference to the vector itself?

本文关键字:向量 引用 无效 vector std      更新时间:2023-10-16

我想知道确切
的含义 std::vector<T>::shrink_to_fit(new_capacity)会使引用无效。

"如果发生重新分配,所有迭代器、指针和引用 与容器相关的容器失效。否则,没有任何变化。

http://www.cplusplus.com/reference/vector/vector/shrink_to_fit/

测试代码:

#include <vector>
#include <iostream>
class Test {
public:
    Test(const std::vector<int>& a) : _a(a) {}
    void print() const {
        std::cout << "[";
        for (auto x:_a) std::cout << " " << x;
        std::cout << " ]n";
    }   
    const std::vector<int>& _a; 
};
int main() {
    std::vector<int> a;
    a.reserve(100);
    for (int i = 0; i < 10; ++i) a.push_back(i);
    Test t(a);
    t.print();
    a.shrink_to_fit();
    t.print(); // will this always work as expected?
}

如果new_capacity小于old_capacity(因此vector的容量缩小),引用(测试类的_a属性)是否可以失效?

你所指的段落的意思是,迭代器或对调整向量大小的元素的引用可能会变得无效。

_a是引用的情况下,正如您的注释所建议的那样,_a将继续是对向量的有效引用,但_a中的任何迭代器或对元素的引用都将无效。

是的

,如果发生重新分配,std::vector::shrink_to_fit()会使引用无效。但是与您的示例代码无关 - 对向量保存的数据的引用或指针将失效,而不是对向量本身的引用:

std::vector<int> v( 10 );
std::vector<int> &vref = v;
int &ref = v[0];
v.resize(2);
v.shrink_to_fit();
// now ref could be invalid, but vref is perfectly fine

如果new_capacity小于old_capacity(因此向量的容量缩小),引用(测试类的_a属性)是否可以失效?

否,Test::_a在以下情况下不会失效:

a.shrink_to_fit();

如果你有一个std::vector<int>::iterator _aitr;,它将指向a的某个元素,那么这样的迭代器将被失效。