#include<set>
std::multiset<int>s;
int main() {
s.insert(1);
s.insert(2);
s.insert(3);
for (auto i=s.rbegin();i!=s.rend();++i) {
auto j=s.lower_bound(*i<<1);
if (j!=s.end())s.erase(j);
}
}
このプログラムがクラッシュし、「マップ/イテレータをデクリメントできません」というエラーが表示されました。私はすべての要素が正の整数であると考えたので、*i<<1
は*i
より大きくなるため、j
の指し示された位置はi
とは異なります。そして、reference:std :: multisetの要素を消去すると、無関係なイテレータが無効になりました
消去された要素への参照とイテレータは無効になります。その他の 参照とイテレータは影響を受けません。
i
の指示位置以来
とj
はj
がi
とループには影響しません消去、異なっています。だから私はなぜそれが間違っているのか混乱している。
環境:Windows10のx86の、Visual Studioの2015 Update 3の
「i!= j」を明示的に比較して、その特異性についてのあなたの推論が実際に保持されているかどうかを確認してください。 – Novelocrat
@Novelocrat: 'i.base()!= j'は逆の反復子を扱っているからです。 – ildjarn
@Novelocrat 'j!= s.end()'に '* i'と' * j'の出力を追加し、 '1 2'だけを期待通りに見ます。 – James