繁体   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