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/list/list/erase/ , syntax is: iterator erase (iterator position);
list<pair<string,int>> l0 { { "name1", 20 }, { "name2", 30 }, { "name3", 40 } };
for( auto &it : l0 )
l0 . erase( it );
May there be a problem that there is a list
of pair<string,int>
and not a list
of a basic data types?
EDIT: The problem is that the code is not compilable.
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 compileThis 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:
Workaround
You shall not use the range-for, but the traditional
for
, and iterating using the return value oferase()
:Live demo