c++ - vector教學 - vector reserve




假設STL向量存儲始終是連續的是否安全? (4)

如果你有一個已調整大小的STL向量,是否可以安全地獲取元素0的地址並假設其餘的向量將跟隨內存?

例如

vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p

C ++ 03標準添加了措辭,以明確向量元素必須是連續的。

C ++ 03 23.2.4第1段包含以下語言,該語言不在 C ++ 98標准文檔中:

vector的元素是連續存儲的,這意味著如果vvector<T, Allocator> ,其中T是除bool之外的某種類型,則它遵循所有0 <= n < v.size()的標識&v[n] == &v[0] + n 0 <= n < v.size()

Herb Sutter在他的一篇博文中討論了這一變化, Cringe not:矢量保證是連續的

......鄰接實際上是矢量抽象的一部分。 事實上,當發現C ++ 98標準並不完全保證連續性時,它是如此重要,C ++ 03標準被修改為明確添加保證。



是的,這是一個有效的假設(*)。

從C ++ 03標準(23.2.4.1):

向量的元素是連續存儲的,這意味著如果v是一個向量,其中T是除了bool之外的某種類型,那麼它服從所有0 <= n <v的身份&v [n] ==&v [0] + n 。尺寸()​​。

(*)...但是在向元素添加元素之後要注意重新分配的數組(使任何指針和迭代器無效)。


存儲始終是連續的,但它可能會隨著向量的容量的變化而移動。

如果在容量更改操作之前在元素零(或任何元素)上有指針,引用或迭代器,則它將失效並且必須重新分配。





vector