2012-02-22 90 views
1

std::vector<std::string>std::vector<unsigned char>に変換する簡単な方法はありますか(また、std::vector<std::string>に戻すには、手動で変換する必要はありません。ベクトルと文字列が実装されていないC++のstd :: vectorをstd :: vector <unsigned char>に変換する

方法は独立し、ヒープに割り当てられた配列の通りですので、あなたにvector<string>を変換できます。?各文字列と短い答えはコンマなどの区切り文字、

+0

あなたが例を与えることができますか? –

+0

あなたの質問を明確にしてください。前者は一連の文字列であり、後者は単一の文字列です。あなたは何らかの区切り文字を必要とします、私は想像します。あなたがしたいことを理解する必要があることを知る前に。一例が助けになるでしょう。 –

+0

基本的に、std :: stringをstd :: vector に変換したい場合は、 'std :: vector char_vec(myString.begin()、myString.end )) '、そうですか?もしstd :: vector をstd :: vector 'に同様に変換する簡単な方法があるかどうか疑問に思っていました。 – user1225011

答えて

1

を追加char**(charの配列のジグザグ配列)、vector<unsigned char>char*(charの配列)内部についてうかがいます。これはあなたの問題を変えます:それらをコピーすることなく配列を連結する方法はありますか?

いいえありません。

0
std::vector<char> chars; 
for (const std::string& s : strings) 
{ 
    for (char c : s) 
    { 
     chars.push_back(c); 
    } 
    chars.push_back(','); 
} 

新しいforループ構文がないとちょっと不器用ですが、あなたはそのアイデアを得ます。

+1

C++にはイテレータがあります!あなたは 'chars.insert(chars.end()、s.begin()、s.end());'と書くことができます。 –

0

Boost Serializationunsigned charのシーケンスにデータ構造を埋め込み、もう一度再構成する必要があります。

0

最初の質問は、なぜ、あなたは何をしようとしていますか? 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()); 
} 

unsigned charcharの暗黙的な変換は のresltを世話をします。 insert後 ターミネータのために、それを追加(push_back);:

あなたがソース内の各 文字列の区切りやターミネーターのいくつかの並べ替えを挿入する必要がある場合は、あなたが同様にループ内でそれを行うことができます セパレーターのために、私は一般的に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?おそらく、あなたは なので、いくつかの特定のプロトコル用のバッファに書式設定します。追加の フォーマットが必要ですか?あなたのプロトコルの文字列のフォーマットは何ですか? (通常、length + data、または'\0'が終了します) プロトコルには何らかの整列が必要ですか? (XDR — の1最も広く使用されるプロトコル—については、次のような何か必要があると思います:例えば

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

を、)

関連する問題