Quando cancelli un elemento da una std::list l'iteratore che hai usato non è più valido (se pensi a come è implementata una lista linkata la cosa dovrebbe essere ovvia). In ogni caso, proprio per gestire casi di questo tipo, std::list::erase restituisce un iteratore all'elemento successivo a quello che hai appena cancellato, per cui puoi fare:
codice:while(iter!=b.end()) // /* Imposto l'iteratore iter , esso passa in rassegna { // * ogni elemento della lista . Se l'elemento è dispari if((*iter)%2!=0) // * viene eliminato. */ iter = b.erase(iter); else ++iter; }