Как "привести" std :: vector <char>к std :: vector - PullRequest
7 голосов
/ 06 декабря 2011

У меня есть std :: vector из байтов (char), я бы хотел сделать эквивалент "C-style casting" этого вектора для вектора типа wchar_t.

Очевидно, что мне действительно нужно скопировать данные, но дело в том, что у меня уже есть поток байтов UTF-16 с левой стороны, я просто хочу переместить его ввектор wchar_t, чтобы я мог его использовать.В идеале, я хотел бы просто поменять буфер, но я не уверен, как это сделать безопасным образом ...

Что такое способ C ++ сделать настолько эффективным, насколько позволяет операция безопасного конверсионного копирования?

ПРИМЕЧАНИЕ:

Я сохраняю свои строки UTF-16 как std::wstring или std::vector<wchar_t>, но у меня есть этот буфер памяти, который, как мне кажется, является UTF-16, и мне нужноскопируйте это, как-нибудь ...

Ответы [ 3 ]

9 голосов
/ 06 декабря 2011

Самый эффективный (и разумный) способ сделать это - не делать этого. Пусть ваш vector<char> владеет буфером данных, и просто создайте пару указателей wchar_t для использования в качестве итераторов, указывающих на вектор.

std::vector<char> vec;
wchar_t* first = reinterpret_cast<wchar_t*>(&vec[0]);
wchar_t* last = reinterpret_cast<wchar_t*>(&vec[0] + vec.size());

Теперь у вас есть пара итераторов, которая будет отлично работать со всеми стандартными библиотечными алгоритмами. И вам не нужно было копировать ни одного байта. :)

(Отказ от ответственности: я предполагаю, что размер вектора делится на sizeof(wchar_t). В противном случае вам придется настроить указатель last)

1 голос
/ 06 декабря 2011
std::vector<char> v1;
std::vector<wchar_t> v2;

const char * cv1 = v1.data();

const wchar_t * cv2 = static_cast<const wchar_t *>(cv1);
std::copy(cv2, cv2 + v1.size() / sizeof(wchar_t), std::back_inserter(v2));
1 голос
/ 06 декабря 2011
std::vector<char> v1;
std::vector<wchar_t> v2;

wchar_t *begin = (wchar_t *) &v2.front();
wchar_t *end   = (wchar_t *) (&v2.back() + 1);

v1.assign(begin, end);

Я не проверял это, но я не могу себе представить, что что-то вроде этого не будет работать ... Если у вас есть проблемы с порядком байтов, это станет немного сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...