[英]vector and dumping
據我所知,向量肯定是連續的,我可以向其中寫入一塊內存,並使用它發送fwrite。 我需要做的就是確保我調用.resize()強制其為我需要的最小長度,然后可以將其用作普通char數組? 此代碼正確嗎
v.resize(numOfElements);
v.clear(); //so i wont get numOfElements + len when i push back
vector<char>v2;
v2.resize(numOfElements*SizeOfType);
while(...)
{
...
v.push_bacK(x);
}
compress(&v2[0], len, &v[0], len);
fwrite(&v2[0], ....)
請注意,我從不后退或彈出v2,我只調整了一次大小並將其用作char數組。 這樣安全嗎? 如果我也轉儲了v也將是安全的(我確實將其推回並清除,我可能會將其轉儲用於測試)
v.resize(numOfElements);
v.clear(); //so i wont get numOfElements + len when i push back
好吧,上面的代碼片段實際上是在分配和創建元素,只是要再次銷毀它們。 實際上與以下內容相同:
v.reserve(numOfElements);
只是這段代碼更快。 所以, v.size() == 0
在這兩種情況下和v.capacity()
可能是相同的 numOfElements
在這兩種情況下,太(雖然這不能保證 )。 但是,在第二種情況下,該容量至少為numOfElements ,這意味着在將push_back的向量中包含這么多的元素之前,不會重新分配內部緩沖區。 請注意,在兩種情況下,如果您嘗試訪問任何元素都是無效的 -因為實際包含的元素為零。
除此之外,我還沒有在您的代碼中發現問題。 它是安全的,我會鼓勵使用它,而不是原始的new
或malloc
因為它提供了更多的安全性。 但是,我不確定“轉儲v”是什么意思。
實際上,為了與C數組在布局上兼容,可以保證std :: vector是連續的。 但是,您必須意識到向量的許多操作都會使指向其元素的所有指針無效,因此您最好堅持使用一種類型:避免在向量上混合使用指針算術和方法調用。
除此之外,這是完全正確的,除了第一行:您想要的是
v.reserve(numOfElements);
這將分配足夠的空間以將numOfElements
存儲到向量中,而
v.resize(numOfElements);
將執行以下操作:
// pseudo-code
if (v.size() < numOfElements)
insert (numOfElements - size) elements default
constructed at the end of the vector
if (v.size() > numOfElements)
erase the last elements so that size = numOfElements
綜上所述,在reserve
您確定向量容量大於或等於numOfElements,在resize
您確定向量大小等於numOfElements。
對於這樣的事情,我個人將使用STLSoft的auto_buffer<>
這樣的類:
作為免責聲明-我沒有使用實際的STLSoft庫版本,我改編了自己的模板,該模板非常相似-我是從Matthew Wilson(STLSoft作者的) “ Imperfect C ++”一書開始的。
當我真的只想要一個普通的C數組時,我發現它很有用,但是大小在運行時必須是動態的。 auto_buffer<>
比普通的舊數組更安全,但是一旦構造完成,您就不必擔心有多少個元素了-就像數組一樣,它總是用它來構造的(所以它不太復雜)比vector<>
-有時更合適)。
auto_buffer<>
的主要缺點是它不是標准的,也不在Boost中,因此您必須將STLSoft集成到項目中或發布自己的版本。
是的,您將char向量用作讀取原始輸入的緩沖區。
// dynamically allocates a buffer of 10,000 char as buffer
std::vector<char> data(10000);
fread(&data[0], sizeof(char),data.size(),fp);
我不會用它來將任何非POD數據類型直接讀入向量中。
您可能會使用向量作為寫入的來源。
但是,我會非常小心地讀回您的內容(序列化可能會更容易)。
fwrite(&data[0], sizeof(char),data.size(),fp);
您正在用resize替換reserve(),也可以替換
vector<char> v2
與
vector<Type> v2
這樣應該可以簡化代碼。
坦率地說,這是我見過的最奇怪的向量用法,但它可能會起作用。 您確定不想使用新的char [size]和boost的某種自動指針嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.