将std :: vector缩小以使对向量本身的引用无效吗?

时间:2017-01-26 21:04:27

标签: c++ vector

我想知道确切的含义 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属性)是否会失效?

3 个答案:

答案 0 :(得分:4)

你所指的通道意味着迭代器或对带有向量大小的元素的引用可能变得无效。

如果_a是引用,正如您的评论所示,_a将继续是对 vector 的有效引用,但任何迭代器或引用都是 _a中的元素将无效。

答案 1 :(得分:3)

如果发生重新分配,则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

答案 2 :(得分:3)

  

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

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

a.shrink_to_fit();

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