回答編集履歴

1

erase 後のイテレータが無効であることを追記

2020/10/02 05:55

投稿

lehshell
lehshell

スコア1147

test CHANGED
@@ -59,3 +59,39 @@
59
59
 
60
60
 
61
61
  for(range) 内で要素を削除するのは、たぶん不可能でしょうね。
62
+
63
+
64
+
65
+ ## 10/2 追記
66
+
67
+ ```
68
+
69
+ for (auto a = array.end(); a != --array.begin(); a--) {
70
+
71
+ if (a->num == 1) {
72
+
73
+ array.erase(a);
74
+
75
+ }
76
+
77
+ }
78
+
79
+ ```
80
+
81
+ auto a = array.end(); の a 利用以外に問題がないわけではありません。
82
+
83
+
84
+
85
+ array.erase(a); 実行後にイテレータ a を使用してはいけません。
86
+
87
+ C++11/C++14
88
+
89
+ 23.3.6.5 vector modifiers
90
+
91
+ iterator erase(const_iterator position);
92
+
93
+ iterator erase(const_iterator first, const_iterator last);
94
+
95
+ Effects: Invalidates iterators and references at or after the point of the erase.
96
+
97
+ 規格上は vector の erase を実行したら iterator は無効です。