Lista stl usuwanie elementu.

0

Witam to znowu ja.
Nowy program nowy problem :D ale są postępy.
A więc piszę sobie funkcję która ma sortować krótką listę. Problem jest taki że lista zawiera obiekty. i ma być sortowana według składnika obiektu który jest nr. ID. Wymyśliłem to tak że pętla szuka największego ID w liście i przerzuca ten obiekt do drugiej listy a z tej przeszukiwanej go usuwa.
Wszystko było by ok gdyby nie to że element przerzucony nie zostaje usunięty. Moje pytanie dlaczego tak jest. I może znacie jakiś łatwiejszy sposób żeby to wykona??

 
void ListaUzytkownika::sortuj_ID()
{
    DaneUzytkownika szukany;
    list<DaneUzytkownika>::iterator iter;
    list<DaneUzytkownika>::iterator najwiekszy;
    while(lista.empty()!=true)
    {
    for( iter=lista.begin(); iter != lista.end(); ++iter )
    {
        if(szukany.Id<iter->Id)
        {
            
            szukany=*iter;
            najwiekszy=iter;
        }
    }
  cout<<szukany;
  posortowana.push_front(szukany);
  lista.erase( najwiekszy );
  cout<<lista.size()<<endl;
    }

Pomożecie?

1
void ListaUzytkownika::sortuj_ID()
{
    lista.sort([](DaneUzytkownika& former, DaneUzytkownika& latter) { return former.Id < latter.Id; } );
}
0

Wysypało mi całą listę błędów a ponieważ nie znam tej funkcji nie wiem jak sobie z nimi poradzić.

warning: lambda expressions only available with -std=c++11 or -std=gnu++11 [enabled by default]

error: no matching function for call to ‘std::list<DaneUzytkownika>::sort(ListaUzytkownika::sortuj_D()::<lambda(DaneUzytkownika&, DaneUzytkownika&)>)’

note: candidates are:

error: template argument for ‘template<class _Tp, class _Alloc> template<class _StrictWeakOrdering> void std::sort(_StrictWeakOrdering)’ uses local type ‘ListaUzytkownika::sortuj_D()::<lambda(DaneUzytkownika&, DaneUzytkownika&)>’

error: trying to instantiate ‘template<class _Tp, class _Alloc> template<class _StrictWeakOrdering> void std::sort(_StrictWeakOrdering)’

0

Upewnij się, że w opcjach kompilacji masz przełącznik -std=c++11.

0

i #include<algorithm>

0
krwq napisał(a):

i #include<algorithm>

Po co?

To std::list::sort, a nie std::sort.

1

A tutaj jak to zrobić przy pomocy konstrukcji wczesniejszego standardu (c++98 i c++03 bodajże):

Jak ktoś wcześniej pisał, trzeba zdefiniować funkcję (lub klasę z przeładowaną funkcją operator(), ale tu powinna wystarczyc zwykła funkcja), która jako argumenty może przyjąć dwa porównywane obiekty Twojej klasy, a jako rezultat zwróci true jeśli obiekt pierwszy ma się znaleźć przed drugim (dla sortowania malejącego na odwrót):

inline bool PorownajPoId(const DaneUzytkownika & Dane1, const DaneUzytkownika & Dane2){

	return Dane1.Id() < Dane2.Id();
}

Adres tej funkcji ma być przekazany funkcji sort. Przykładowy main:

int main(void){

	DaneUzytkownika DaneFranka("Franek");
	DaneUzytkownika DaneWlodka("Wlodek");
	DaneUzytkownika DaneAnki("Anka");
	DaneUzytkownika DaneJasia("Jasiu");
	list<DaneUzytkownika> lista;

	lista.push_back(DaneAnki);
	lista.push_back(DaneWlodka);
	lista.push_back(DaneJasia);
	lista.push_back(DaneFranka);

	cout << "Przed sortowaniem: " << endl;
	// kopiujemy elementy od poczatku do konca listy do strumienia wyjsciowego z lancuchem "\n" jako separatorem
	copy( lista.begin(), lista.end(), ostream_iterator<DaneUzytkownika>(cout, "\n") );

	lista.sort(PorownajPoId); // tu przekazujemy funkcje porownajaca

	cout << "Po sortowaniu: " << endl;
	copy( lista.begin(), lista.end(), ostream_iterator<DaneUzytkownika>(cout, "\n") );

	return 0;
}

Trzeba dodać #include<iterator>, żeby się skompilowało. No i dodalem pola z imionami, żeby efekt byl wyraźniejszy.

Wyjście:

Przed sortowaniem:
ID: 3
Imie: Anka

ID: 2
Imie: Wlodek

ID: 4
Imie: Jasiu

ID: 1
Imie: Franek

Po sortowaniu:
ID: 1
Imie: Franek

ID: 2
Imie: Wlodek

ID: 3
Imie: Anka

ID: 4
Imie: Jasiu

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