独自のイテレータを使用してコンテナを割り当てることは安全ですか?


10

例として:

string s = "123";
s.assign(find(s.begin(),s.end(),'2'), s.end());

上記のコードの動作は定義されていますか?それとも未定義の動作につながりますか?

回答:


5

はい。このバージョンの割り当ては次のように定義されます

template<class InputIterator>
  constexpr basic_string& assign(InputIterator first, InputIterator last);

制約:InputIteratorは、入力反復子として適格な型です。

効果:次と同等:return assign(basic_string(first、last、get_allocator()));

これは、変更が行われる前に計算された一時的なものを示しています。


「に等しい」は、実際の一時ファイルを作成する必要があることを意味しません。ただし、セマンティクスは同じでなければなりません。また、示されているバージョンは自己割り当てに対して安全であるため、実際の実装も安全でなければなりません。
MSalters

@MSalters。同意した。私はそれについてコメントするつもりでしたが、アロケータの使用量のどれだけを取り除くことができるかを判断しようとして迷いました。
AProgrammer

これは文字列に固有のものであることに注意してください。たとえば、ベクターの場合はUBになります。
TC

@TC、標準を引用できますか?
アドラー

1
@Adler、ベクターの説明が参照するこの表を参照してください。
AProgrammer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.