Скопировать содержимое std :: vector <char>в буфер char *? - PullRequest
6 голосов
/ 08 ноября 2011

У меня есть 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++;
}

Спасибо ..

Ответы [ 4 ]

18 голосов
/ 08 ноября 2011
std::copy(_v.begin(), _v.end(), buffer);

Это предпочтительный способ сделать это в C ++. Это безопасно скопировать, если buffer достаточно большой.

10 голосов
/ 08 ноября 2011

Если вам просто нужно 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);
4 голосов
/ 08 ноября 2011

Самый безопасный способ скопировать vector<char> в буфер char * - это скопировать его в другой вектор, а затем использовать внутренний буфер этого вектора:

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

Конечно, вы также можете получить доступ к_v s буфер, если вам на самом деле не нужно копировать данные.Кроме того, имейте в виду, что указатель будет признан недействительным, если вектор будет изменен.

Если вам нужно скопировать его в определенный буфер, то вам нужно знать, что буфер достаточно большой, прежде чем копировать;нет никаких проверок границ для массивов.После того как вы проверили размер, ваш второй метод является лучшим.(Первый работает только в том случае, если vector::iterator является указателем, что не гарантируется; хотя вы можете изменить второй аргумент на &_v[0], чтобы заставить его работать. Третий делает то же самое, но более сложен и, вероятно, долженбыть исправлено, чтобы оно не изменяло buffer).

0 голосов
/ 08 ноября 2011

Хорошо, вы хотите присвоить *buffer для случая 3, но это должно сработать.Первый почти наверняка не будет работать.

РЕДАКТИРОВАТЬ: Я исправлен в отношении # 2.

...