簡體   English   中英

std::vector 收縮以適應是否會使對向量本身的引用無效?

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

我想知道確切的意思
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()將使引用無效。 但是與您的示例代碼無關 - 對 vector 保存的數據的引用或指針將無效,而不是對 vector 本身的引用:

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某個元素,那么這樣的迭代器就會失效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM