最も単純な形式で:
std::vector<unsigned char> vec(
std::istreambuf_iterator<char>(std::cin)
, std::istreambuf_iterator<char>()
);
std::cin
実際のストリームに置き換えます。
std::istreambuf_iterator<>
は入力反復子であり、ランダムアクセスまたは前方反復子ではないため、上記は複数のメモリ割り当てを行う可能性があります (非常に数バイトを超えるファイルの場合)。のようなイテレータを減算end - begin
したり、呼び出したりしstd::distance(begin, end)
ます。ベクトルが最初に空で作成され、次にstd::vector<>::reserve()
ファイル長のメモリを割り当てるために呼び出され、最後に上記のようにファイル全体を読み取るために範囲挿入が呼び出された場合、vec.insert(vec.end(), beg, end)
1つのメモリ割り当てに減らすことができます。beg
end
std::istreambuf_iterator<>
ファイル サイズが数キロバイトを超える場合は、メモリをカーネルからユーザー空間にコピーしないようにプロセス メモリにマップするのが最も効率的です。
使用される理由は、通常は と のみに特殊化std::istreambuf_iterator<char>
されている実装が使用するためです。それにもかかわらず、C および C++ 標準では、すべての型がパディング ビットのない同じバイナリ レイアウトを持つ必要があるため、との間の変換 (および同じ型であるのとは異なり、すべて異なる型です) はビット パターンを保持するため、安全です。std::char_traits<>
char
wchar_t
char
char
unsigned char
signed char
signed int
int
[ベーシック.ファンダメンタル/1]
無地char
、signed char
、およびunsigned char
は 3 つの異なるタイプであり、まとめてナロー文字タイプと呼ばれます。A char
、 a signed char
、および anunsigned char
は、同じ量のストレージを占有し、同じ配置要件を持ちます。つまり、それらは同じオブジェクト表現を持っています...ナロー文字タイプの場合、オブジェクト表現のすべてのビットが値表現に参加します...符号なしナロー文字タイプの場合、値表現の可能な各ビットパターンは個別の数値を表します。これらの要件は、他のタイプには当てはまりません。特定の実装では、プレーンオブジェクトは aまたは;char
と同じ値を取ることができます。どちらが実装定義です。タイプの各値についてsigned char
unsigned char
i
unsigned char
0 から 255 までの範囲で、からへの整数変換の結果が であり、から からへの整数変換の結果が であるようなj
型の値が存在します。char
i
char
j
j
unsigned char
i