Usuwanie elementów z listy - iterator

0

Mam dwie listy z taką samą ilością danych. Przy próbie usunięcia elementu program się wywraca.

		for (list<char>::iterator pierwsza = lista1.begin(); pierwsza != lista1.end();)
		{
			bool usuniete = false;

			for (list<char>::iterator druga = lista2.begin(); druga != lista2.end();)
			{
				if (*pierwsza == *druga)
				{
					lista1.erase(pierwsza);
					usuniete = true;

					lista2.erase(druga);
				}		
				if (!usuniete)
					druga++;
			}

			if (!usuniete)
				pierwsza++;
		}

Jak ominąć problem nieistniejącego elementu?

0

To tworzy kopie spełniające twoje wymagania:

#include<list>
#include<algorithm>
template<class T>
class IsInRangePredicate : 
        public unary_function<typename T::value_type, bool> // bez tego dziedziczenia tez zadziała, ale żeby był porządek
{
const T::const_iterator& mBegin; 
const T::const_iterator& mEnd;

public:
     IsInRangePredicate(const T::const_iterator& begin, const T::const_iterator& end) :
            mBegin(begin) 
            mEnd(end)
     {}

     bool operator(const T::value_type& value) const
     {
          return std::find(mBegin, mEnd, value) != mEnd;
     }
};


.....

list<char> wynik1,wynik2;

std::remove_copy_if(pierwsza.begin(), pierwsza.end(), wynik1.begin(),
        IsInRangePredicate(druga.begin(), druga.end()));

std::remove_copy_if(druga.begin(), druga.end(), wynik2.begin(),
        IsInRangePredicate(pierwsza.begin(), pierwsza.end()));

1 użytkowników online, w tym zalogowanych: 0, gości: 1