簡體   English   中英

矢量和傾銷

[英]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的向量中包含這么多的元素之前,不會重新分配內部緩沖區。 請注意,在兩種情況下,如果您嘗試訪問任何元素都是無效的 -因為實際包含的元素為零。

除此之外,我還沒有在您的代碼中發現問題。 它是安全的,我會鼓勵使用它,而不是原始的newmalloc因為它提供了更多的安全性。 但是,我不確定“轉儲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.

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