2011-01-21 6 views
6

ファイルの内容をchar配列に読み込んだ後、そのデータの一部をベクトルに読み込みました。 どのようにして、char配列の範囲をベクトルにコピーできますか? vectorとchar配列の両方が同じ型(unsigned char)です。char配列からベクトルにデータの範囲をコピーする方法は?

現在のコードは次のような何かを行く:

int p = 0; 

for(...){ 
    short len = (arr[p+1] << 8) | arr[p+0]; 
    p+=2; 
    ... 
    for(...len...){ 
     vec.push_back(arr[p]); 
     p++; 
    } 
} 

私はどのようにpush_back、とループをドロップすることで、これを改善したいと思いますか?もちろん、

vec.insert(vec.end(), arr, arr+len); 

あなたが何をしたいのかに、おそらく近いれ、またassign()あります:ベクトルに何かを追加は

答えて

17

insert()メンバ関数を使用して行うことができる

vec.assign(arr, arr+len); 

しかし、あなたの質問を読んで、なぜすぐにベクトルに読み込むことができるときに、最初にC配列を読み込んでその内容をベクトルにコピーするのか疑問に思った。 1つの連続したメモリブロックにデータを保持するためには、std::vector<>が必要で、最初の要素のアドレスを取ってこのブロックにアクセスできます。代わりに、あなたも&*vec.begin()による最初の要素のアドレスを取得することができ&vec[0]

std::size_t my_read(char* buffer, std::size_t buffer_size); 

vec.resize(appropriate_length); 
vec.resize(my_read_func(&vec[0], vec.size())); 

:ちょうどあなたがベクトルに十分なスペースがあることを確認してください。ただし、いずれの方法でもでなければならないことに注意してください。ベクトルの少なくとも1つの要素があることを確認してください。 2つの方法のどれもそれをチェックする必要はありません(デバッグビルドの場合は実装がそうするかもしれませんが)。これに失敗すると、未定義の動作が呼び出されます。

+0

私は同時に2つの異なる場所で同じファイルからデータを読み込むので、バッファに読み込む必要があります。 'vec.assign(arr + p、arr + p + len);'(これは正しい?少なくとも動作する) – Newbie

+2

@Newbie:それが正しいかどうかは誰にも分かりませんあなたは完全なコードを投稿していません...あなたのコードはあなたがしようとしていることを推測しなければならない穴がいっぱいです。 – etarion

+0

@etarion:本当に?私が示したコードは、arr []配列に関連するすべての重要なものを持っていました。 – Newbie

関連する問題