iterator validity ,after erase() call in std::set

c++, set, stl

Solution

Since you are just apparently deleting every element of the set, you could just do:

    for (SETTYPE::iterator itr2=li.begin();itr2!=li.end();itr2++) 
    {
            classA *lt=(classA*)(*itr2);
            delete lt;
    }
    li.clear(); // clear the elements

Problem

Do erase call in std::set invalidate iterator ? As i have done below 5th from last line..? if yes what is better way to erase all elements from set ``` class classA { public: classA(){}; ~classA(){}; }; struct structB { }; typedef std::set <classA*, structB> SETTYPE; typedef std::map <int, SETTYPE>MAPTYPE; int __cdecl wmain (int argc, wchar_t* pArgs[]) { MAPTYPE mapObj; /* ... .. Some Operation Here ... */ for (MAPTYPE::iterator itr1=mapObj.begin(); itr1!=mapObj.end(); itr1++) { SETTYPE li=(*itr1).second; for (SETTYPE::iterator itr2=li.begin();itr2!=li.end();itr2++) { classA *lt=(classA*)(*itr2); li.erase(itr2); delete lt; // Does it invalidate Iterator ? } } } ```

Original source