簡體   English   中英

將數組復制到std :: vector

[英]Copying an array into a std::vector

我在搜索這個主題時,發現了許多方法可以將array []轉換為std :: vector,例如使用:

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函數的錯誤處理,以簡化帖子)。

它正在工作,但是我很不安全。 我相信還可以,因為矢量使用的內存是連續的,但是我從未見過有人以這種方式使用矢量。

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

是的,使用std::vector C ++標准是安全的,可以確保將元素存儲在連續的內存位置。

C ++ 11標准:

23.3.6.1類templatevector概述[vector.overview]

向量是支持隨機訪問迭代器的序列容器。 另外,它支持(攤銷)最后的固定時間插入和擦除操作; 在中間插入和擦除需要線性時間。 存儲管理是自動處理的,盡管可以提供一些提示以提高效率。 向量的元素是連續存儲的 ,這意味着如果v是一個向量 ,其中T是非bool的某種類型,則對於all0 <= n <v.size(),它遵循恆等式&v [n] ==&v [0] + n。

是的,這樣做很好。 如果看起來更好,則可能要使用myvet.data()而不是&myvet[0] ,但它們的作用相同。 另外,如果情況允許,您可以改用std::copy並具有更多的類型安全性以及所有其他C ++標准庫優點。

vector使用的存儲保證是連續的,這使其適合用作緩沖區或其他功能。

確保在使用從data&v[0]獲得的指針時,不要修改vector (例如,在其上調用push_back等),因為vector可能會在這些操作之一上調整其緩沖區大小並使該參數無效指針。

該方法是正確的,僅取決於標准要求的具有連續內存的向量。 我相信在c ++ 11中,向量中有一個新的data()成員函數,該函數返回指向緩沖區的指針。 還要注意,在`memcpy的情況下,您需要傳遞字節大小而不是數組大小

在存儲vector是保證連續分配和unsigned char是POD,因此這是完全安全的memcpy到它(假設你沒有拷貝,當然比你更已分配)。

首先進行大小調整,它應該可以正常工作。

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

是的,使用memcpy的解決方案是正確的; vector保持的緩沖區是連續的。 但這不是很安全的類型,所以更喜歡assignstd::copy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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