将std :: vector <char>的内容复制到char * buffer?</char>中

时间:2011-11-08 08:46:17

标签: c++ stl stdvector

我有一个std :: vector。我想将向量的内容复制到一定大小的char *缓冲区中。

有没有一种安全的方法可以做到这一点?

我可以这样做吗?

memcpy(buffer, _v.begin(), buffer_size);

还是这个?

std::copy(_v.begin(), _v.end(), buffer); // throws a warning (unsafe)

还是这个?

for (int i = 0; i < _v.size(); i++)
{
  *buffer = _v[i];
  buffer++;
}

谢谢..

5 个答案:

答案 0 :(得分:18)

std::copy(_v.begin(), _v.end(), buffer);

这是在C ++中执行此操作的首选方法。如果buffer足够大,可以安全地复制。

答案 1 :(得分:10)

如果您只需要char*,那么您可以这样做:

char *buffer=&v[0];//v is guaranteed to be a contiguous block of memory.
//use buffer

注意更改buffer指向的数据也会更改矢量的内容!

或者,如果您需要副本,则分配大小等于v.size()字节的内存,并使用std::copy

 char *buffer = new char[v.size()];
 std::copy(v.begin(), v.end(), buffer);

答案 2 :(得分:4)

vector<char>复制到char *缓冲区的最安全方法是将其复制到另一个向量,然后使用该向量的内部缓冲区:

std::vector<char> copy = _v;
char * buffer = &copy[0];

当然,如果您实际上不需要复制数据,也可以访问_v缓冲区。另外,请注意,如果调整矢量大小,指针将无效。

如果需要将其复制到特定的缓冲区中,那么在复制之前你需要知道缓冲区足够大;数组上没有边界检查。一旦你检查了尺寸,你的第二种方法是最好的。 (第一个只有在vector::iterator是一个指针时才有效,但不能保证;虽然你可以将第二个参数更改为&_v[0]以使其正常工作。第三个参数做同样的事情,但更复杂,可能应该修复,因此不会修改buffer)。

答案 3 :(得分:0)

嗯,你想为案例3分配*buffer,但这应该有效。第一个几乎肯定不会起作用。

编辑:关于#2,我的立场得到了纠正。

答案 4 :(得分:0)

static std::vector<unsigned char> read_binary_file (const std::string filename)
{
    // binary mode is only for switching off newline translation
    std::ifstream file(filename, std::ios::binary);
    file.unsetf(std::ios::skipws);

    std::streampos file_size;
    file.seekg(0, std::ios::end);
    file_size = file.tellg();
    file.seekg(0, std::ios::beg);

    std::vector<unsigned char> vec(file_size);
    vec.insert(vec.begin(),
               std::istream_iterator<unsigned char>(file),
               std::istream_iterator<unsigned char>());
    return (vec);
}

然后:

auto vec = read_binary_file(filename);
auto src = (char*) new char[vec.size()];
std::copy(vec.begin(), vec.end(), src);

但请记住稍后删除[] src