如何将std :: vector <char>“强制转换”为std :: vector <wchar_t> </wchar_t> </char>

时间:2011-12-06 14:51:26

标签: c++ stl

我有一个std :: vector of bytes(char),我想做的只是“C-style casting”这个向量到一个向量是类型为wchar_t

显然,我真正需要做的是复制数据,但这里的事情是我左侧已经有一个UTF-16字节流,我只想把它移到wchar_t矢量,这样我就可以使用它。理想情况下,我只想交换缓冲区,但我不确定如何以安全的方式做到这一点......

C ++实现安全转换复制操作效率的方法是什么?

注意:

我将我的UTF-16字符串存储为std::wstringstd::vector<wchar_t>但是我有这个内存缓冲区,我碰巧知道它是UTF-16,我需要复制它,不知怎的......

3 个答案:

答案 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));