簡體   English   中英

如何“施放”std :: vector <char> 到std :: vector <wchar_t>

[英]How to “cast” a std::vector<char> to std::vector<wchar_t>

我有一個std :: vector of bytes( char ),我想把這個向量的“C-style cast”等同於一個wchar_t類型的向量。

顯然,我真正需要做的是復制數據,但這里的事情是我左側已經有一個UTF-16字節流,我只想把它移到wchar_t向量上,以便我可以使用它。 理想情況下,我只想交換緩沖區,但我不確定如何以安全的方式執行此操作...

C ++實現安全轉換復制操作的有效方法是什么?

注意:

我將我的UTF-16字符串存儲為std::wstringstd::vector<wchar_t>但我有這個內存緩沖區,我碰巧知道是UTF-16,我需要復制它,不知怎的......

最有效(也是最安全)的方法就是不這樣做。 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指針)

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::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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM