簡體   English   中英

轉換C ++ std :: vector <std::string> 到std :: vector <unsigned char> (反之亦然)

[英]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.

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