将std :: vector <char>的内容复制到char*缓冲区中?

kre*_*tar 8 c++ stl stdvector

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

有安全的方法吗?

我可以这样做吗?

memcpy(buffer, _v.begin(), buffer_size);
Run Code Online (Sandbox Code Playgroud)

或这个?

std::copy(_v.begin(), _v.end(), buffer); // throws a warning (unsafe)
Run Code Online (Sandbox Code Playgroud)

或这个?

for (int i = 0; i < _v.size(); i++)
{
  *buffer = _v[i];
  buffer++;
}
Run Code Online (Sandbox Code Playgroud)

谢谢..

ks1*_*322 19

std::copy(_v.begin(), _v.end(), buffer);
Run Code Online (Sandbox Code Playgroud)

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

  • @AdamZalcman:为什么?`char*`不一定是c-string. (8认同)
  • @AdamZalcman:另外,如果这是合理的,那么首先选择`std :: vector <char>`是错误的,因为`std :: string`将是一个*更好的*选择,以防`char*`需要用c-string来处理. (5认同)
  • @AdamZalcman:这不合理.如果向量内容很多`\ 0`怎么办? (4认同)
  • @AdamZalcman:不,我不认为这是马虎的答案.当我看到`std :: vector <char>`而不是`std :: string`时,我假设向量的内容不能保证是c-string. (4认同)
  • @krebstar:是的.`vector <char>`保证是一个连续的内存块? (3认同)

Naw*_*waz 11

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

char *buffer=&v[0];//v is guaranteed to be a contiguous block of memory.
//use buffer
Run Code Online (Sandbox Code Playgroud)

注意通过buffer更改向量的内容来更改指向的数据!

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

 char *buffer = new char[v.size()];
 std::copy(v.begin(), v.end(), buffer);
Run Code Online (Sandbox Code Playgroud)