0

2つの入力イテレータの状態を部分的に取得するstd::stringコンストラクタのWebサイトcplusplusドキュメント:

[first、last)の範囲の文字のシーケンスを同じ順序でコピーします。

最初、最後:範囲内の初期位置と最終位置にイテレータを入力します。使用される範囲は[first、last)で、最初から最後までのすべての文字が含まれます。これには、最初が指す文字が含まれますが、最後が指す文字は含まれません。

これは、退化した場合にどういう意味first == lastですか?一方firstは含まれ、他方lastは除外されますか?この場合、公式のC ++標準は何が起こるべきだと言っていますか?例外をスローする必要がありますか?

4

4 に答える 4

4

あなたが読んでいるのはどのドキュメントかわかりませんが、標準では(§21.4.2/ 15)と書かれています。

[..][begin, end)は、シーケンス要件の表に示されているように、範囲内の値から文字列を作成します

また、シーケンス要件テーブル(表100)はX a(i, j)、有効な範囲[i, j)を次のように定義しています。

範囲に等しいシーケンスコンテナを構築します[i, j)

範囲は、2番目のイテレータが最初のイテレータから(インクリメントによって)到達可能である場合に有効です。等しい2つのイテレータの場合、範囲は空です。§24.2.1/7を参照してください。

範囲は、計算の開始と終了を指定するイテレーターのペアです。範囲[i,i)は空の範囲です。一般に、範囲[i,j)とは、が指す要素から始まり、が指す要素までのデータ構造内の要素を指しますが、 。が指す要素iは含まれませんj。範囲は、から到達可能で[i,j)ある場合にのみ有効です。ライブラリ内の関数を無効な範囲に適用した結果は未定義です。ji

したがってfirst == last、あなたが言うように、あなたは空の文字列を取得します。lastから到達できない場合はfirst、未定義の動作があります。

于 2013-02-28T18:17:39.990 に答える
3

範囲が空なので、コピーするものはありません。結果は空の文字列です。

于 2013-02-28T18:16:56.343 に答える
2

これは、first == lastである縮退した場合にどういう意味ですか?

これは、入力範囲が空であるため、文字列が空になることを意味します。

この場合、標準は何が起こるべきであると言っていますか?

C ++ 11 24.2.1 / 7によると:

範囲[i,i)は空の範囲です

于 2013-02-28T18:17:05.267 に答える
0

私がこれを数回使用したことの1つstd::stringは、大きなCスタイルの文字列(const char*)の部分文字列からを構築することです。2つのポインターを渡すことができconst char*、最初のポインターで始まり、2番目のポインターの前で1つ終わる文字から文字列を作成します。

の場合first == last、結果は空の文字列になります。の場合first > last、動作は未定義です(Mooing Duckに感謝)

于 2013-02-28T18:18:34.513 に答える