2014-02-18 101 views
0

我在想什麼,最好的辦法是轉換一個整數數組,例如將int數組轉換爲字符串的正確方法是什麼?

int array[] = {0x53,0x74,0x61,0x63,0x6B,0x4F,0x76,0x65,0x72,0x66,0x6C,0x6F,0x77,0x00}

爲一個字符串,上述整數數組是等價的:

int array[] = {'S','t','a','c','k','O','v','e','r','f','l','o','w',0}

所以得到的字符串將是

std::string so("StackOverflow");

我想通過使用foreach循環eacht元素並將其添加到字符串中,將其轉換爲char,但我想知道是否有更乾淨/更快/更乾淨的方法來執行此操作?

+0

我認爲你的意思是'char array []',而不是'int array []'。 –

+0

@barakmanos爲什麼? Ints也可以存儲十六進制值。 –

+0

哦,對不起,沒有看到「等效」那裏... –

回答

4

int是可以隱式轉換爲char,你不需要任何演員。所有的標準容器有拿一對迭代器的構造函數,這樣你就可以通過開始和數組的結尾:

std::string so(std::begin(array), std::end(array)); 

這可能不是任何比手動循環更快,但我認爲它符合標準整潔和清潔。

還有一種乾淨的方法可以對指針數組也做同樣的事情。使用Boost Indirect Iterator:

#include <boost/iterator/indirect_iterator.hpp> 

std::string s (
    boost::make_indirect_iterator(std::begin(array)), 
    boost::make_indirect_iterator(std::end(array))); 

還有一件事我只注意到 - 你不需要int數組0只是標記字符串的結束。 std::end將推導出數組的大小,0將實際結束於結果字符串中。

+0

任何方式來使這項工作在'int *數組''太? – Gizmo

+0

@Gizmo'std :: string so(array,array + length)'應該工作 - 結束迭代器是1個可用數據,在這種情況下'array + length'應該指向數組中的'0x00'值; – UldisK

+0

@Gizmo爲指針數組增加了一個例子。 – jrok

0

如果你正在尋找一個(略)更快的方式,那麼你可以做:

char str[sizeof(array)/sizeof(*array)]; 

for (int i=0; i<sizeof(array)/sizeof(*array); i++) 
    str[i] = (char)array[i]; 

std::string so(str); 

這將「救你」 std::string::operator+=重複呼叫...

相關問題