15

この質問により、ベクトルをそれ自体に追加することについて私は確信が持てなくなりました。質問は次のとおりです。次のコード行は私が期待することを行いますが、標準に準拠していますか?

vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());

以下 (なしreserve()) はまだ動作しますが、標準に準拠していますか?

vec.insert(vec.end(), vec.begin(), vec.end());

または実装に依存しますか?

4

1 に答える 1

17

C++03 ISO 仕様 (§23.1.1、表 67) (および @AndyProwl が言及したように、§23.2.3、C++11 ISO 仕様の表 11) によると、シーケンス要件の一部として、a.insert(p, i, j)シーケンス コンテナー内の操作には、次の前提条件があります。

ijへのイテレータではありませんa

つまり、シーケンス コンテナーは、範囲挿入操作を行う場合、元のコンテナーに対する反復子からその範囲が定義されないことを安全に想定することができます。

その結果、コンテナーの要素をそれ自体に挿入しようとすると、標準ライブラリ関数が呼び出され、前提条件が破られます。これは、未定義の動作をもたらします。つまり、ライブラリの実装者が親切な人であれば、一部のプラットフォームでは機能する可能性がありますが、正当な理由もなく、ひどく壊滅的に失敗する可能性があります。

お役に立てれば!

于 2013-02-09T22:11:19.603 に答える