2011-12-06 55 views
7

我有個字節(char)的一個std ::向量,我想要做的只是「C風格鑄造」相當於這個載體是一個類型爲wchar_t的矢量圖。如何「投」一個std ::矢量<char>到std :: vector的<wchar_t>

顯然,我真正必須做的是複製數據,但這裏的事情是我已經在左邊有一個UTF-16字節流,我只想將它移動到wchar_t向量,以便我可以使用它。理想情況下,我只想交換緩衝區,但我不知道如何以安全的方式做到這一點......

什麼是C++的方式做一個有效的安全轉換複製操作允許?

注:

我做我的存儲UTF-16的字符串作爲std::wstringstd::vector<wchar_t>,但我有我碰巧知道是UTF-16這種內存緩衝區,而我需要複製它,不知何故?

+2

什麼?你有UTF-16數據存儲爲'char'?順便說一句。從'char'到'wchar_t'的轉換是使用'widen'完成的,但我想這不是你想要的。http://www.cplusplus.com/reference/std/locale/ctype/widen/ –

+0

http:/ /www.codeproject.com/Tips/196097/Converting-ANSI-to-Unicode-and-back?display=Print可能會回答它 –

+0

並擴展Let_Me_Be的評論:爲什麼你將UTF-16數據存儲爲'char'? – Griwes

回答

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爲了理智和簡單 – johnathon

+0

這已經死了,然後我可以使用分配,並將複製的東西,對不對?把它複製在我的腦海裏很好,我只是希望有一個交換技巧。我的意思是,std :: vector的內部是相同的,我只想換掉內部(像'reinterpret_cast'),但這樣做會很好。 –

+0

'static_cast'會做得很好。 –

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

我沒有測試過這一點,但我無法想象這樣的事情是行不通的......如果你有問題字節序,這將成爲相當多的複雜。

+0

使用'&v2.back()+ 1'而不是'end()',因爲'end()'返回一個迭代器。令人困惑的是,它可能似乎工作,因爲迭代器碰巧是一個指針,然後停止工作(在另一個實現或'vector'的調試版本上)。 –

+0

@SteveJessop:這是一個很好的觀點。謝謝。 –

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)); 
相關問題