2012-01-15 114 views
8

我正在尋找關於這個話題,我發現很多方法[]數組轉換爲標準::向量,就像使用:複製數組到一個std ::向量

assign(a, a + n) 

,或者直接在構造函數:

std::vector<unsigned char> v (a, a + n); 

這些解決我的問題,但我想知道是否有可能(正確)的事情:

myvet.resize(10); 
memcpy(&myvet[0], buffer, 10); 

我想知道這是因爲我有以下代碼:

IDiskAccess::ERetRead nsDisks::DiskAccess::Read(std::vector<uint8_t>& bufferRead, int32_t totalToRead) 
{ 
    uint8_t* data = new uint8_t[totalToRead]; 
    DWORD totalRead; 
    ReadFile(mhFile, data, totalToRead, &totalRead, NULL); 
    bufferRead.resize(totalRead); 
    bufferRead.assign(data, data + totalRead); 
    delete[] data; 

    return IDiskAccess::READ_OK; 
} 

而且我想這樣做:

IDiskAccess::ERetRead nsDisks::DiskAccess::Read(std::vector<uint8_t>& bufferRead, int32_t totalToRead) 
{ 
    bufferRead.resize(totalToRead); 
    DWORD totalRead; 
    ReadFile(mhFile, &bufferRead[0], totalToRead, &totalRead, NULL); 
    bufferRead.resize(totalRead); 

    return IDiskAccess::READ_OK; 
} 

(我已刪除ReadFile函數的錯誤處理,簡化後)。

它正在工作,但我擔心它不安全。我相信這是可以的,因爲矢量所使用的內存是連續的,但我從來沒有見過有人使用這種方法。

使用這樣的向量是否正確?還有其他更好的選擇嗎?

回答

8

是的,它是安全的,std::vector C++標準保證元素將存儲在連續的內存位置。

C++ 11標準:

23.3.6.1類templatevector概述[vector.overview]

的載體是支持隨機訪問迭代器的序列容器。此外,它還支持(分期付款)恆定時間插入和擦除操作;在線性時間插入和擦除中間。存儲管理是自動處理的,儘管提示可以提高效率。 一個向量的元素相鄰地存儲,這意味着IFV是avector whereT是某種類型的比布爾其它,那麼它遵循身份& v [n]的== & v [0] + n,用於ALL0 < = N < v 。尺寸()​​。

1

做你的調整第一,它應該工作正常。

vector<int> v; 
v.resize(100); 
memcpy(&v[0], someArrayOfSize100, 100 * sizeof(int)); 
+3

他*不*調整第一字節不Ë大小(看他的函數的第一行)。 – celtschk 2012-01-15 17:18:18

+1

我並不是暗示他沒有這麼做。我只是強調它的重要性。 – TheBuzzSaw 2012-01-15 18:08:17

+1

你可能沒有*表示*來暗示它,但你做到了。 – celtschk 2012-01-15 18:11:22

2

vector的內存保證連續地分配和unsigned char是POD,因此這是完全安全的,memcpy進去(比假設您已經分配當然,你不要複製更多)。

1

是,使用memcpy溶液是正確的;由vector持有的緩衝區是連續的。但它不是類型安全的,所以更喜歡assignstd::copy

5

是的,這樣做很好。如果你看起來更好,你可能想要做myvet.data()而不是&myvet[0],但它們都有相同的效果。另外,如果情況允許,你可以使用std::copy來代替,並且有更多的類型安全和所有其他C++標準庫的好處。

一個vector使用存儲保證是連續的,這使得它適合於用作緩衝劑或與其他功能。

請確保您不要修改vector(如調用push_back就可以了,等等),而你正在使用你data&v[0]得到的指針,因爲vector可以調整所執行的操作的一個它的緩衝區和無效指針。

3

這種方法是正確的,它僅依賴於具有由標準所要求的連續存儲器的矢量。我相信在C++ 11中向量中有一個新的data()成員函數,它返回指向緩衝區的指針。還要注意的是在'的情況下的memcpy你需要傳遞大小的數組

相關問題