如果你有一個已經調整大小的STL向量,是否可以接受元素0的地址,並假設向量的其餘部分將在內存中?假設STL矢量存儲始終是連續的,是否安全?
例如
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
如果你有一個已經調整大小的STL向量,是否可以接受元素0的地址,並假設向量的其餘部分將在內存中?假設STL矢量存儲始終是連續的,是否安全?
例如
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
是的,這是一個有效的假設(*)。
從C++ 03標準(23.2.4.1):
向量的元素被存儲 連續,這意味着如果v是 向量,其中T是一些 類型比其它bool,那麼它服從 身份& v [n] == & v [0] + n對於 全部0 < = n < v.size()。
(*)...但注意在向其添加元素後重新分配陣列(使任何指針和迭代器無效)。
是的。
應該總是支持連續
存儲始終是連續的,但作爲載體的容量發生變化,也可能會移動。
如果您在容量更改操作之前在元素零(或任何元素)上有指針,引用或迭代器,則它將失效並且必須重新分配。
std::vector
保證項目存儲在一個連續的數組中,因此是數組的首選替代,也可用於與平臺相關的低級代碼(如Win32 API調用)進行接口。爲了得到一個指向數組使用:
&myVector.front();
C++ 03標準添加了措辭以明確矢量元素必須是連續的。
C++ 03 23.2.4段1包含下列語言是不是C++ 98標準文件中:
一個
vector
的元素被存儲 連續,這意味着如果v
是vector<T, Allocator>
其中T
是 某種類型比bool
等,那麼它 服從所有0 <= n < v.size()
身份&v[n] == &v[0] + n
。
在他的博客條目之一這種變化香草薩特會談,Cringe not: Vectors are guaranteed to be contiguous:
...連續性是在 矢量抽象的事實部分。其實很重要, ,當發現 那個C++ 98標準沒有完全保證連續性時,修改了 C++ 03標準,明確加了保證。
+1如果您使用的是標準草案,或任何尚未批准和正式的,請說出來。在目前的標準中我找不到那樣的東西。 – 2009-01-13 21:49:02