6

私の質問は非常に単純です。getline(istream, string) はどのように実装されていますか? getline (char* s, streamsize n ) のような固定サイズの char 配列を持つ問題をどのように解決できますか? 彼らは一時バッファを使用しており、新しい char[length] または別の適切な構造体を何度も呼び出していますか?

4

3 に答える 3

9

getline(istream&, string&)行を読み取るように実装されています。決定的な実装はありません。各ライブラリはおそらく互いに異なります。

可能な実装:

istream& getline(istream& stream, string& str)
{
  char ch;
  str.clear();
  while (stream.get(ch) && ch != '\n')
    str.push_back(ch);
  return stream;
}
于 2012-09-04T17:32:44.403 に答える
5

@SethCarnegieは正しいです。複数の実装が可能です。C++ 標準では、どちらを使用する必要があるかは規定されていません。

しかし、質問はまだ興味深いです。これは古典的なコンピュータ サイエンスの問題です。割り当てるメモリの量が事前にわからない場合、どこに、どのようにメモリを割り当てるのでしょうか?

  1. 1 つの解決策は、文字列の文字を個々の文字のリンク リストとして記録することです。これはメモリ効率が良くなく、高速でもありませんが、機能し、堅牢で、プログラミングが比較的簡単です。ただし、標準ライブラリがこの方法で実装される可能性は低いです。

  2. 2 番目の解決策は、128 文字などの固定長のバッファーを割り当てることです。バッファーがオーバーフローした場合は、2 倍の長さの 256 文字の新しいバッファーを割り当て、古い文字を新しいストレージにコピーしてから、古い文字を解放します。新しいバッファーがオーバーフローした場合は、倍の長さ (512 文字) のさらに新しいバッファーを再度割り当ててから、プロセスを繰り返します。等々。

  3. 3 番目のソリューションは、最初の 2 つを組み合わせたものです。文字配列のリンクされたリストが維持されます。リストの最初の 2 つのメンバーには、それぞれ 128 文字が格納されます (たとえば)。3 番目のストアは 256 です。4 番目のストアは 512 などです。これには、他の方法よりも多くのプログラミングが必要ですが、アプリケーションによっては、どちらよりも望ましい場合があります。

そして、可能な実装のリストは続きます。

標準ライブラリの実装に関して、@SteveJessop は、「[a] 標準ライブラリの文字列を (1) として実装することは許可されていませんoperator[]。これは、文字列の複雑さの要件のためです。C++11 では、次のように実装することは許可されていません。 (3) いずれか, 文字列の連続性要件のため. C++ 委員会は、アクティブな C++ 実装は (3) 連続性要件を追加した時点で. もちろん、getline以前の文字で一時的に好きなことを行うことができる.それらすべてを文字列に追加しますが、標準では文字列ができることについて多くのことを述べています。」

getlineはいくつかの方法のいずれかでデータを一時的に保存できますが、データの最終的なターゲットが文字列である場合、これはgetlineの実装に関連している可能性があるため、この追加は関連しています。@SteveJessop はさらに、「文字列自体については、独自の拡張率を選択できることを除いて、実装はほとんど (2) である必要があります。定数を乗算する限り、毎回 2 倍にする必要はありません。」

于 2012-09-04T17:41:42.857 に答える