C++ Erasing from list of pairs

后端 未结 1 1535
青春惊慌失措
青春惊慌失措 2020-12-22 07:56

Very simple: I have the following code and the method erase is not working. I do not see any problem there because if I go to http://www.cplusplus.com/reference

相关标签:
1条回答
  • 2020-12-22 08:14

    The range-for iterates through a container by giving you access to the elements in the container, and not an iterator to an element.

    So in for( auto &it : l0 ), it isn't an iterator to a pair but a reference to a pair. This is why your code doesn't compile

    This being said, as πάνταῥεῖ pointed out when he initially closed this as a duplicate of Keeping a valid vector::iterator after erase(), even if your code would compile it wouldn't work because of the invalidation of the iterator following the erase:

    Iterators, pointers and references referring to elements removed by the function are invalidated. All other iterators, pointers and references keep their validity.

    Workaround

    You shall not use the range-for, but the traditional for, and iterating using the return value of erase() :

    for (auto it=l0.begin(); it!=l0.end(); ) 
        it = l0.erase(it);  // to avoid incrementing an invalidated iterator
    

    Live demo

    0 讨论(0)
提交回复
热议问题