2013-07-31 46 views
11

我有一個指向uint8類型的矢量的指針。將uint8的矢量轉換爲字符串

我該如何拿這個指針並將矢量中的數據轉換成代表其內容的完整字符串?

+0

你應該已經知道從向量長度 - >尺寸()。它內部是否有非ascii數據? – Duck

+0

這是所有的ASCII數據。 –

回答

17

你可以只初始化std::stringstd::vector<uint8_t>獲得的序列:

std::string str(v->begin(), v->end()); 

沒有必要玩什麼花樣檢查std::vector<uint8_t>是否爲空:如果是這樣,該範圍將空着。但是,您可能需要檢查指針是否爲v爲空。以上要求它指向一個有效的對象。

+0

如果我問你爲什麼離開這麼久,可以嗎? – 0x499602D2

+3

@ 0x499602D2:你的意思是,爲什麼我暫時不回答問題?很簡單:我忙於在工作之外完成工作。現在我要忙於工作,除了工作之外還要工作。 –

+0

我很驚訝這個答案被接受,因爲它不產生「代表其內容」的東西。如果你的矢量是「{1,2,3,4,5,6,7,8,9}」,那麼你的輸出將是一串不可顯示的字符! –

0
vector<uint8_t> *p; 
string str(
    p && !p->empty() ? &*p->begin()    : NULL, 
    p && !p->empty() ? &*p->begin() + p->size() : NULL); 
+0

沒有必要使用'empty()'向量來玩任何技巧:它們會返回一個有效的範圍,而'std :: string'有一個帶有一對輸入迭代器的構造函數。 –

+0

@DietmarKühl:噢你是對的,我有這樣做的習慣,因爲我有時會編譯一箇舊的STL實現,它沒有模板超載,完全忘了。 – Mehrdad

+0

是的,舊的RogueWave實現仍然作爲Sun Studio的默認標準C++庫發佈,我猜。如果我不得不使用它,我實際上會使用'std :: copy(v-> begin(),v-> end(),std :: back_inserter(str));'。 –

2

對於那些誰想要轉換完成後一個字符串聲明,你可以使用的std :: string ::分配(),例如:

std::string str; 
std::vector<uint8_t> v; 
str.assign(v.begin(), v.end());