3

v2次のコードは正常にコンパイルされ、値を次の値で上書きしますv1

std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<int> v2 = {6, 7, 8, 9, 10};

std::copy(v1.begin(), v1.end(), v2.begin());

の3番目の引数std::copyはOutputIteratorです。ただし、Container要件a.begin()では、がContainerオブジェクトである場合、次のように定義されaた戻りタイプを持つ必要があると指定されています。iterator

フォワードイテレータの要件を満たすイテレータカテゴリ。

フォワードイテレータの要件には出力イテレータの要件が含まれていないため、上記の例は未定義ですか?イテレータが1つになるという明確な保証はありませんが、出力イテレータとしてイテレータを使用しています。

begin()上記のコードは有効であると確信していますが、コンテナの詳細から、返されるフォワードイテレータが実際には出力イテレータの要件もサポートしていることを推測できます。その場合、いつ出力イテレータを返さbegin() ないのですか?コンテナconstが存在する場合、または他の状況がある場合のみですか?

4

2 に答える 2

8

順方向イテレーターは、シーケンスのタイプに応じて、ミュータブルであれば、出力イテレーターの仕様に準拠できます。(イテレータ要件を入力するという事実とは異なり) 明示的に綴られているわけではありませんが、要件表を見ると

出力反復子の要件

特定の前方反復子がそれらに準拠しているかどうかを確認できます。

*r = o
(§24.2.5/1):X可変イテレータの場合reference、への参照ですT

変更可能な参照は割り当て可能です (明らかに、割り当て不可能な型を持っている場合を除きます)。

++rr++*r++ = o
(§24.2.5 Table 109) 前方反復子の要件

表 109 の最初の行は、出力反復子の場合と同じ要件ですが、前方反復子には注釈がない点が異なります。reference2 行目は、aを返す必要があることを指定しているため、出力イテレータよりも制限が厳しくなっています。

結論として、コピー代入可能な型のシーケンスへの可変前方イテレータがある場合、有効な出力 iterator があります

(技術的には、 a および可変メンバーを持つ一連の型への定数イテレータoperator=(...) constも資格がありますが、誰もそのようなことをしないことを望みましょう。)

于 2012-09-26T19:00:56.650 に答える
4

前方反復子の要件には、出力反復子の要件が含まれていません

これは逆に聞こえます。OutputIterator は、ForwardIteratorより少ない基準を満たす必要があります。(前方反復子は、インクリメント後に再利用可能であるべきです。つまり、それらを 2 回インクリメントしても同じ結果が得られるはずです)。

したがって、アルゴリズムが完了するまで出力反復子が有効なままであれば問題ありません。IOW:

auto outit = std::begin(v2);
std::advance(outit, v1.size()); // or: std::distance(std::begin(v1), std::end(v2))
// outit should still be valid here

コメントへの編集:

§ 24.2.1

出力反復子の要件をさらに満たす反復子は、 と呼ばれmutable iteratorsます。不変イテレータは と呼ばれconstant iteratorsます。

ここで、可変ランダム アクセス イテレータをvector::begin()返すと言って、これを結び付けるビットを見つけてみましょう。

情報について

§ 24.2.5 前方反復子 [forward.iterators]

1クラスまたはポインター型 X は、次の場合に順方向反復子の要件を満たします。

  • X は、入力反復子 (24.2.3) の要件を満たします。
  • X は DefaultConstructible 要件 (17.6.3.1) を満たします。
  • X が変更可能な反復子の場合、参照は T への参照です。X が定数反復子の場合、参照は const T への参照です。
  • 表 109 の式が有効であり、示されたセマンティクスを持っている。
  • タイプ X のオブジェクトは、以下で説明するマルチパス保証を提供します。
于 2012-09-26T18:49:20.327 に答える