C++ 如何";铸造;a std::vector<;char>;到std::vector<;wchar_t>;

C++ 如何";铸造;a std::vector<;char>;到std::vector<;wchar_t>;,c++,stl,C++,Stl,我有一个字节的std::vector(char),我想把这个向量等效为一个wchar\t类型的向量 显然,我真正需要做的是复制数据,但这里的事情是,我在左侧已经有一个UTF-16字节流,我只想把它移到wchar\t向量,这样我就可以使用它了。理想情况下,我只想交换缓冲区,但我不确定如何以安全的方式进行交换 C++的方式是什么,就像安全转换拷贝操作一样有效? 注: 我确实将我的UTF-16字符串存储为std::wstring或std::vector,但我有一个内存缓冲区,我碰巧知道它是UTF-1

我有一个字节的std::vector(
char
),我想把这个向量等效为一个
wchar\t
类型的向量

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

C++的方式是什么,就像安全转换拷贝操作一样有效? 注: 我确实将我的UTF-16字符串存储为

std::wstring
std::vector
,但我有一个内存缓冲区,我碰巧知道它是UTF-16,我需要复制它,不知何故…

std::vector v1;
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);
std::向量v2; wchar_t*begin=(wchar_t*)&v2.front(); wchar_t*end=(wchar_t*)(&v2.back()+1); v1.分配(开始、结束);
我还没有测试过这个,但我无法想象像这样的东西会不起作用。。。如果您有endian问题,这将变得相当复杂。

std::vector v1;
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));
std::向量v2; const char*cv1=v1.data(); 常数wchar_t*cv2=静态铸造(cv1); std::copy(cv2,cv2+v1.size()/sizeof(wchar_t),std::back_inserter(v2));
最有效(也是最明智)的方法就是不去做。让您的
vector
拥有数据缓冲区,只需创建一对
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());
std::向量向量向量机;
wchar_t*first=重新解释铸件(&vec[0]);
wchar_t*last=reinterpret_cast(&vec[0]+vec.size());
现在您有了一个迭代器对,它可以与所有标准库算法配合使用。 您不必复制一个字节。:)


(免责声明:我假设向量的大小可以被
sizeof(wchar\u t)
整除。否则您必须调整
最后一个
指针)

什么?您将UTF-16数据存储为
char
?顺便说一句,从
char
wchar\u t
的转换是使用
加宽
完成的,但是我想,这不是你想要的,也许你会回答它,并扩展Let_Me_Be的评论:为什么你将UTF-16数据存储为
char
?@Let_Me_Be使其成为这样,你就不必担心字节顺序O之类的愚蠢事情。o@JohnLeidegren如果向量的内容是utf-16,则理想情况下可以将其作为带有&v[0]的wchar\u t指针传递,而不会出现问题,我真正的问题是如何将utf-16打包成向量字符?网络代码?那是死的,然后我就可以使用assign,它会复制这些东西,对吗?在我的脑海里复制它是很好的,我只是希望有一个交换技巧。我的意思是,std::vector的内部结构是相同的,我只是想交换内部结构(比如
重新解释\u cast
),但这会很好。
静态\u cast
会很好。@AlexandreC:我认为
静态\u cast
将是未定义的行为。我还认为它在实践中不会起作用,这取决于向量是否存储大小或结束指针。@MooingDuck:
static\u cast
永远不会比
reinterpret\u cast
更有效,并且在(非函数)指针之间进行转换时也同样有效。使用
&v2.back()+1
而不是
end()
,因为
end()
返回一个迭代器。令人困惑的是,由于迭代器恰好是一个指针,因此它似乎可以工作,然后稍后停止工作(在另一个实现上或使用调试版本的
vector
)。