2

これは簡単に実行できますが、正しく実行するのは難しいようです。l が size()/2 であるとしましょう。sz の後半を szout に挿入したい。

私の最初の試みは

szout.insert(szout.end(), &sz[l], sz.end());

しかし、大きなコンパイル エラーが発生しました。次に試したのは

szout.insert(szout.end(), &sz[l], &sz[sz.size()-1]);

いいえ、最後の文字がありません。だから明らかに私は-1すべきではありません

szout.insert(szout.end(), &sz[l], &sz[sz.size()]);

これは機能しますが、最後の文字を参照しているため、これは未定義の動作です。

szout.insert(szout.end(), &sz[l], &sz[sz.size()-1]+1);

これは機能しますが、気分が悪いです。-1 と +1... 変ですよね。

最後の文字にコピーする正しい方法は何ですか?

4

1 に答える 1

4

これは機能しますが、最後の文字を参照しているため、これは未定義の動作です。

いいえ、最後の文字を超えて逆参照していません。「最後の文字の1文字後」のアドレスを取得していますが、それは標準で明示的に許可されています。

この言語は、C++ 標準では非常に一般的です。

24.2.1.5: 配列への通常のポインターが、配列の最後の要素を指すポインター値があることを保証するように、どの反復子型にも、対応するシーケンスの最後の要素を指す反復子値があります。

基本的に、P任意の配列の末尾の 1 つ後ろを指すポインターはすべて有効と見なされます。イテレータについても同様です。

ただし、読み取りまたは書き込みを試みるのsz[sz.size()]は実際には間違っていますが、コードはそれを行っていません。標準ライブラリは常に終了ポインターを「最後を1つ過ぎたもの」として解釈するため、絶対に安全です

szout.insert(szout.end(), &sz[l], &sz[sz.size()]);
于 2013-02-25T00:30:53.493 に答える