從我讀到的內容來看,std::vector
是在與需要連續內存字節數組的c函數接口時使用的適當結構。然而,我想知道如何在某些情況下確定陣列的大小正確設置std :: vector大小的方法
我寫了一個小樣本程序來說明我的意思。
int main(int argc, char *argv[])
{
std::vector<unsigned char>v;
unsigned char p[1024];
sprintf((char*)&p[0], "%10d", 10);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(30);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
memcpy(&v[0], &p[0], 20);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(50);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(0);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.resize(20);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.resize(0);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
return 0;
}
的輸出(沒有多少令人驚訝):
Size: 0 Length: 0
Size: 0 Length: 30
Size: 0 Length: 30
Size: 0 Length: 50
Size: 0 Length: 50
Size: 20 Length: 50
Size: 0 Length: 50
我爲什麼這樣做的原因是這樣的,因爲我預留一定大小的緩衝區,然後通過recv()
通過這個內存插槽。由於我必須將內存作爲指針傳遞,因此根據recv
返回的值無法調整矢量大小。 現在,當接收到的字節數小於緩衝區時,我會想到我可以以某種方式調整向量的大小,所以當我將它傳回時,調用者可以執行v.size()
以及返回的元素數接收。
當我從上面的例子看數據時,當使用resize()
緩衝區的大小被正確調整,但數據不見了。那麼我是否真的必須單獨將內存複製到新的矢量中才能獲得正確的大小?這聽起來像是對我來說非常不必要的開銷。或者有什麼方法可以告訴矢量它目前應該保存多少個元素?
謝謝,這的確是正確答案,我在調試器中用我的testprogram驗證了它。現在我也明白爲什麼。 :)這也適合我的實現模型,因爲我不是在開始時使用構造函數,而是想手動設置大小。 – Devolus 2013-05-02 14:14:03