我正在搜索这个主题,我找到了很多方法将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函数的错误处理以简化帖子).
它有效,但我担心它不安全.我相信它没关系,因为矢量使用的内存是连续的,但我从未见过有人使用矢量这种方式.
使用这样的矢量是否正确?还有其他更好的选择吗?
是的,它是安全的,std::vectorC++标准保证元素将存储在连续的内存位置.
C++ 11标准:
23.3.6.1类templatevector概述[vector.overview]
向量是一个支持随机访问迭代器的序列容器.此外,它最终支持(摊销)恒定时间插入和擦除操作; 在中间插入和擦除需要线性时间.存储管理是自动处理的,但可以提供提示以提高效率.向量的元素是连续存储的,这意味着ifv是avector,其中T是除bool之外的某种类型,那么它服从于all0 <= n <v.size()的身份&v [n] ==&v [0] + n.
是的,这样做很好.你可能想做myvet.data()而不是&myvet[0]看起来对你好一点,但它们都有相同的效果.此外,如果情况许可,您可以使用,std::copy并具有更多的类型安全性和所有其他C++标准库的好东西.
vector保证使用的存储是连续的,这使其适合用作缓冲区或其他功能.
确保在使用从中获取的指针时不要修改vector(例如调用push_back它等),data或者&v[0]因为vector可以在其中一个操作上调整缓冲区大小并使指针无效.