[英]converting a c++ std::vector<std::string> to std::vector<unsigned char> (and vice versa)
是否有一種簡單的方法可以將std::vector<std::string>
轉換為std::vector<unsigned char>
(然后再次轉換為std::vector<std::string>
,而無需手動轉換每個字符串並添加定界符,例如逗號?
最簡潔的答案是不。
向量和字符串的實現方式是作為獨立的,堆分配的數組。 因此,在考慮內部因素時,可以將vector<string>
轉換為char**
(鋸齒狀的char數組),將vector<unsigned char>
轉換為char*
( char*
的數組)。 這將您的問題變成:有什么方法可以串聯數組而不必復制它們?
不,沒有。
std::vector<char> chars;
for (const std::string& s : strings)
{
for (char c : s)
{
chars.push_back(c);
}
chars.push_back(',');
}
如果沒有新的for循環語法,它會顯得有些笨拙,但是您可以理解。
Boost序列化應該讓您將數據結構填充到unsigned char
序列中,然后再次重新構造它。
第一個問題是為什么,您要做什么? std::vector<std::string>
代表什么,轉換的語義應該是什么? 如果只想連接,那么最簡單的解決方案是:
std::vector<unsigned char> results;
for ( std::vector<std::string>::const_iterator iter = source.begin();
iter != source.end();
++ iter ) {
results.insert( results.end(), iter->begin(), iter->end() );
}
將char
隱式轉換為unsigned char
將處理reslt。
如果您需要為源中的每個字符串插入某種分隔符或終止符,則也可以在循環中執行此操作:對於終止符,只需將其( push_back
)附加在insert
; 對於分隔符,我通常有條件地在insert
之前附加它,例如:
std::vector<unsigned char> results;
for ( std::vector<std::string>::const_iterator iter = source.begin();
iter != source.end();
++ iter ) {
if ( iter != source.begin() ) {
results.push_back( separator );
}
results.insert( results.end(), iter->begin(), iter->end() );
}
但是問題是:為什么要使用unsigned char
? 大概是因為您要格式化為某些特定協議的緩沖區。 是否需要其他格式? 協議中字符串的格式是什么? (通常,它是長度+數據,或者是'\\0'
終止。)協議是否需要某種對齊方式? (對於XDR(使用最廣泛的協議之一),您需要類似以下內容:
std::vector<unsigned char> results;
for ( std::vector<std::string>::const_iterator iter = source.begin();
iter != source.end();
++ iter ) {
size_t len = iter->size();
results.push_back( (len >> 24) & 0xFF );
results.push_back( (len >> 16) & 0xFF );
results.push_back( (len >> 8) & 0xFF );
results.push_back( (len ) & 0xFF );
results.insert( results.end(), iter->begin(), iter->end() );
while ( results.size() % 4 != 0 ) {
results.push_back( '\0' );
}
}
, 例如。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.