我有一个std :: vector of bytes(char
),我想做的只是“C-style casting”这个向量到一个向量是类型为wchar_t
。
显然,我真正需要做的是复制数据,但这里的事情是我左侧已经有一个UTF-16字节流,我只想把它移到wchar_t
矢量,这样我就可以使用它。理想情况下,我只想交换缓冲区,但我不确定如何以安全的方式做到这一点......
C ++实现安全转换复制操作效率的方法是什么?
我将我的UTF-16字符串存储为std::wstring
或std::vector<wchar_t>
但是我有这个内存缓冲区,我碰巧知道它是UTF-16,我需要复制它,不知怎的......
答案 0 :(得分:9)
最有效(也是最安全)的方法是不要这样做。让你的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 :(得分:1)
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);
我没有对此进行测试,但我无法想象这样的事情是行不通的......如果你有端点问题,这会变得相当复杂。
答案 2 :(得分:1)
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));