4

次のコードを検討してください。

Class MyClass自己定義クラスです:

class MyClass
{
public:
    MyClass(int v) : Val(v) {}
    int Val;
};

次に、次のコードは、Debug Assertion Failedを呼び出した直後にループ内で発生しますit = T.erase(it);

unordered_set<MyClass*> T;
unordered_set<MyClass*>::iterator it;

for (int i=0; i<10; i++)
    T.insert(new MyClass(i));

for (it = T.begin(); it != T.end(); it++)
{
    if ( (*it)->Val == 5 )
        it = T.erase(it); // After this line executes, in the next loop, the error occurs.
}

それを解決する方法とその理由は? PS: 私の環境:VS2010

4

2 に答える 2

4

最後の要素が Val = 5 であるとします。

it = T.erase(it)が呼び出され、 にit設定されT.end()ます。

その後、 が呼び出されますが、は既に終了に設定されているit++ため、エラーが発生します。it

基本的に...現在のコードの要素を消去すると、イテレータが 2 倍進むことになります。

代わりにこのようなものを使用できます....

for (it = T.begin(); it != T.end(); (*it)->Val == 5? it = T.erase(it) : ++it)
  ;
于 2014-04-23T18:36:28.997 に答える