この問題のより適切なタイトルが見つかりませんでした。必要に応じて、以下の質問に従って更新してください。
iter
a の要素を指すイテレータ - を考えてみましょうstd::vector<int>
。*iter
次を使用して、現在のイテレータの位置にの値を挿入しています。
iter = target.insert(iter, *iter);
insert
新しく挿入された要素にイテレータが返されることを理解しています。ここで、上記のステートメントを次のように変更しました。
iter = target.insert(iter, *iter++);
それがぎこちない動作になることはわかっていたので、Segmentation faultが発生しました。私が理解できないのは、上記の割り当てがどのように評価されるかです。つまり、その割り当て後にどの要素をiter
指すかです。私が理解している限り、後置インクリメント演算子を使用したため、最初のステートメントと同様に動作するはずです。これは、以下のサンプル割り当てから推測しています。
i = i++;
上記の割り当ては の値に影響しないため、 のi
場合も同様です*iter++
。
舞台裏での実際の行動は何ですか?
これは実際のコードです:
std::vector<int>::iterator begin = target.begin();
while (begin != target.end()) {
if (*begin % 2 == 0) {
begin = target.erase(begin);
} else {
begin = target.insert(begin, *begin); // I changed this line
begin += 2;
}
}
基本的に、上記のコードはベクトルから偶数要素を削除し、奇数要素を複製しています。
編集:
前の変更に加えて、2 行目を に変更すると++begin
、現在のコードと同じように機能します。そこで、else
ブロック内の 2 行を次の行に置き換えました。
begin = target.insert(begin, *begin++);
++begin;
そのため、前のケースよりも 1 つ後ろのイテレータを割り当てているようです。
だから、これは私がこの行動から理解したものです:
*begin++
最初に を逆参照しbegin
て、現在の場所の値を取得します。begin
ポストインクリメント- ポストインクリメントの
insert
後、反復子の前に逆参照された値を挿入するようになりました。したがって、元の の前に挿入するのbegin
ではなく、 の前に挿入し++begin
ます。そして、++begin
挿入された場所に値を返します。
私はそれを正しく解釈しましたか?