将数组复制到std :: vector中

时间:2012-01-15 17:12:27

标签: c++ 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函数的错误处理以简化帖子)。

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

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

6 个答案:

答案 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持有的缓冲区是连续的。但它不是类型安全的,所以更喜欢assignstd::copy