我正在搜索这个主题,我找到了很多方法将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函数的错误处理以简化帖子)。
它正在发挥作用,但我担心它不安全。我相信它没关系,因为矢量使用的内存是连续的,但我从未见过有人使用矢量这种方式。
使用这样的矢量是否正确?还有其他更好的选择吗?
答案 0 :(得分:8)
是的,std::vector
C ++标准保证元素将存储在连续的内存位置是安全的。
C ++ 11标准:
23.3.6.1班级模板向导概述[vector.overview]
vector是一个支持随机访问迭代器的序列容器。此外,它最终支持(摊销)恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。存储管理是自动处理的,但可以提供提示以提高效率。 向量的元素是连续存储的,这意味着ifv是avector,其中T是某种类型而不是bool,那么它服从身份&amp; v [n] ==&amp; v [0] + n all0&lt; = n&lt; v.size()。
答案 1 :(得分:5)
是的,这样做很好。如果你看起来更好,你可能想要myvet.data()
而不是&myvet[0]
,但它们都具有相同的效果。此外,如果情况允许,您可以使用std::copy
代替更多类型安全性和所有其他C ++标准库的好东西。
vector
使用的存储保证是连续的,这使其适合用作缓冲区或其他函数。
确保在使用从vector
或{{1}获得的指针时,不要修改push_back
(例如在其上调用data
等)因为&v[0]
可以在其中一个操作上调整缓冲区大小并使指针无效。
答案 2 :(得分:3)
该方法是正确的,它仅取决于具有标准所需的连续存储器的向量。我相信在c ++ 11中,向量中有一个新的data()
成员函数,它返回一个指向缓冲区的指针。另请注意,在`memcpy的情况下,您需要传递以字节为单位的大小而不是数组的大小
答案 3 :(得分:2)
保证vector
中的内存是连续分配的,unsigned char是POD,因此memcpy
进入它是完全安全的(假设你没有复制超过你分配的内容,当然)。
答案 4 :(得分:1)
你的大小首先,它应该可以正常工作。
vector<int> v;
v.resize(100);
memcpy(&v[0], someArrayOfSize100, 100 * sizeof(int));
答案 5 :(得分:1)
是的,使用memcpy
的解决方案是正确的; vector
持有的缓冲区是连续的。但它不是类型安全的,所以更喜欢assign
或std::copy
。