- 追加された行はこの色です。
- 削除された行はこの色です。
[[ssacontents]]
** 悪名高き後置きインクリメント演算子(hoge++)を使うシーン [#c4e7b54d]
*** mapの要素をループの中で削除する場合 [#ae33235f]
map<int,int> intMap;
...
map<int,int>::iterator ite = intMap.begin();
map<int,int>;;iterator end = intMap.end();
while (ite != end) {
map<int,int>::iterator ite = intMap.begin();
// map<int,int>::terator end = intMap.end();
// while (ite != end)
// ↑のようにendをあらかじめ評価してはいけない
while (ite != intMap.end()) {
...
if (削除する?) {
ite = erase(ite++);
intMap.erase(ite++);
// 内部では、 { iterator tmp = ite; ++ite; erase(tmp); } の動作になる
}
else {
++ite;
}
}
- iteratorのルール
-- iteratorは、insert, eraseなどコンテナのサイズに影響を与える操作をした場合、その値は無効になる。無効なiteratorへアクセスした場合の動作は「未定義」となる。
-- たとえば、ループの中で要素を削除したり、追加したりする場合。要注意。
*** integerの減算カウンタ [#q17515ea]
void hoge(int count) {
while(count--) {
... do something;
}
}