将数组复制到std :: vector中

Ren*_*ert 8 c++ vector

我正在搜索这个主题,我找到了很多方法将array []转换为std :: vector,就像使用:

assign(a, a + n)
Run Code Online (Sandbox Code Playgroud)

或者,直接在构造函数中:

std::vector<unsigned char> v ( a, a + n );
Run Code Online (Sandbox Code Playgroud)

那些解决了我的问题,但我想知道是否可能(并且正确):

myvet.resize( 10 );
memcpy( &myvet[0], buffer, 10 );
Run Code Online (Sandbox Code Playgroud)

我想知道这是因为我有以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

我想这样做:

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;
}
Run Code Online (Sandbox Code Playgroud)

(我已经删除了ReadFile函数的错误处理以简化帖子).

它有效,但我担心它不安全.我相信它没关系,因为矢量使用的内存是连续的,但我从未见过有人使用矢量这种方式.

使用这样的矢量是否正确?还有其他更好的选择吗?

Alo*_*ave 8

是的,它是安全的,std::vectorC++标准保证元素将存储在连续的内存位置.

C++ 11标准:

23.3.6.1类templatevector概述[vector.overview]

向量是一个支持随机访问迭代器的序列容器.此外,它最终支持(摊销)恒定时间插入和擦除操作; 在中间插入和擦除需要线性时间.存储管理是自动处理的,但可以提供提示以提高效率.向量的元素是连续存储的,这意味着ifv是avector,其中T是除bool之外的某种类型,那么它服从于all0 <= n <v.size()的身份&v [n] ==&v [0] + n.


Set*_*gie 5

是的,这样做很好.你可能想做myvet.data()而不是&myvet[0]看起来对你好一点,但它们都有相同的效果.此外,如果情况许可,您可以使用,std::copy并具有更多的类型安全性和所有其他C++标准库的好东西.

vector保证使用的存储是连续的,这使其适合用作缓冲区或其他功能.

确保在使用从中获取的指针时不要修改vector(例如调用push_back它等),data或者&v[0]因为vector可以在其中一个操作上调整缓冲区大小并使指针无效.