回答編集履歴

1

間違いの修正

2020/10/01 13:58

投稿

amiya
amiya

スコア1218

test CHANGED
@@ -1,3 +1,7 @@
1
+ (最初の内容に誤りがありましたm(__)m)
2
+
3
+
4
+
1
5
  シンプルに考えるとよいかと思います。
2
6
 
3
7
 
@@ -18,11 +22,11 @@
18
22
 
19
23
  まず初めに、`auto a = array.end();`で、
20
24
 
21
- 1番終わりの要素へのアクセスを得ます。
25
+ 1番終わり**次**要素へのアクセスを得ます。
22
26
 
23
27
  vectorの要素数が例えば3個(`0〜2`)であれば、
24
28
 
25
- `2`が入る事をイメージしてください。
29
+ `3`が入る事をイメージしてください。
26
30
 
27
31
  (実際にはIteratorなので配列のように直接添字が入る訳ではないですが)
28
32
 
@@ -40,9 +44,21 @@
40
44
 
41
45
 
42
46
 
43
- この後、forの内部が実行されて、仮アクセスしてい、`2`要素削除されたとします。
47
+ この後、forの内部が実行されてaの中にアクセスるのです
44
48
 
49
+ 1周目の時点ではaはvectorの範囲外を指しているため、問題になります。
50
+
51
+ たまたま、ifの条件が成立しなかったため問題になっていなかっただけのようです。
52
+
53
+ `auto a = --array.end();`等として、一番最後の要素から始めるようにしないといけません。
54
+
55
+
56
+
57
+ そこは飛ばして、現在、本来の最終の要素である、`2`をイテレータが指しているとします。
58
+
59
+ これが条件に合致して、`2`の要素が削除されたとします。
60
+
45
- 要素数が減るので、`array.end()`は`1`に変化します。
61
+ 要素数が減るので、`--array.end()`は`1`に変化します。
46
62
 
47
63
 
48
64
 
@@ -69,3 +85,7 @@
69
85
 
70
86
 
71
87
  このパターンに当てはめて考えてみれば、beginスタートはうまく行かないことがわかると思います。
88
+
89
+ 削除してしまうと、その分前に詰まるので、毎回イテレータを進めると、削除した次の要素を飛ばしてしまいます。
90
+
91
+ その為には、削除したときはイテレータを進めない等の対策が必要になり、ロジックがちょっと複雑になります。