1

バッファを埋める必要があるメソッド (たとえば、 のラッパーfread)を作成していて、(実行時に決定される) 状況によっては、必要なバッファ サイズを適切に推測できる場合、このメソッドに何を渡す必要がありますか?この機会を利用するには、合理的な種類のバッファを許可し、ユーザーからの複数の呼び出しを必要としませんか?

  • を使用したいのですinsert_iteratorが、一定量のメモリを予約するように指示できません。

  • 一方、テンプレート化されたパラメーターとしてコンテナーを渡すと、コンテナーには標準のインターフェイスがないため、問題が発生します。(例: vectorand stringhave reserve, but dequeand listdo not. または、コンテナーにない可能性がありますpush_back。それが必須であることは見たことがないと思います。など)

では、このような状況ではどうするのが適切でしょうか?

4

2 に答える 2

2

イテレータを使用する非常に一般的な関数を作成してから、さまざまなシーケンスコンテナタイプ(ベクトル、リスト、両端キュー、文字列)を取得するより特殊な関数のファミリを作成し、より一般的な関数に転送する前に適切なアクションを実行できます。次に例を示します。

template<typename OutputIterator>
fill_buffer_iterator_version(OutputIterator it)
{
    // fill data through output iterator
} 

// default generic version uses back_inserter, all standard
// sequence containers support push_back
template<typename Container>
fill_buffer(Container & c)
{
    fill_buffer_iterator_version(std::back_inserter(c));
}

// specialize for vector   
fill_buffer(std::vector<char> & v)
{
    v.reserve(100);
    fill_buffer_iterator_version(std::back_inserter(v));
}
于 2012-07-07T05:52:10.140 に答える
0

読み取るバイト数がわかっているので、をresize呼び出す前にメソッドを使用してくださいfread。それに渡すbegin。または、カスタマイズされた(テンプレート化された)バージョンでは、(参照により)コンテナーを渡し、「ファイル読み取り」の前にコンテナーにメモリーを割り当てて、同じことを行うことができます。

于 2012-07-07T05:40:15.393 に答える