Vertauschen von List-Elementen
-
Hallo zusammen
Ich hab eine kleine Frage. Wie kann ich in einer Liste die Elemente vertauschen. Ich habe eine Liste mit elementen, in denen stehen verschiedene Angaben.
Ein Element hat 5 verschiedene Wert: Alter, Strasse... und ich möchte nach eines dieser Elemente sortieren. Ich habe schon die Abfrage gemacht ob das spezielle Argument kleiner ist, doch leider kann ich den Iterator nicht vertauschen. Mit dem swap-Befehl klappt es auch nicht!!
Wäre cool wenn mir jemand weiter helfen könnte!!
-
Guck dir mal std::sort an oder du nutzt list<T>::sort(). Vielleicht hilft dir das weiter!?
-
Mit sort ist es nicht getan da ich nach einem bestimmten teil im element sortieren möchte!! Ich hab eine list<struct>, das heißt in dieser Struktur wo ich eingelesen hab möchte ich nach einem Element sortieren.
Kann ich den Sort-Befehl irgendwo modifizieren??
Gruß
-
Jap:
bool isAbeforeB(const Struct& a, const Struct& b) { return a.element < b.element; } ... meineListe.sort(isABeforeB);
Guck dir mal eine STL-Einführung an, fast alle Algorithmen lassen sich durch eigene Funktionen und Funktoren anpassen.
-
1.) std::list<...> hat eine Member-Funktion swap. Warum funktioniert die dir
nicht2.) std::list<...> hat auch eine Member-Funktion sort. Definiere einfach einen
< - Operator für deine struct und schon kannst du sie auch verwenden.mfg JJ
-
Hab ich auch schon versucht aber bekomme dann einen Fehler
F:\Michael\N7\Netzwerk\henne\Subprog\06_SortOrderList\Order.cpp(116) : error C2664: 'void __thiscall std::list<class COrder *,class std::allocator<class COrder *> >::sort(struct std::greater<class COrder *>)' : Konvertierung des Parameters 1 von 'bo ol (const class COrder &,const class COrder &)' in 'struct std::greater<class COrder *>' nicht moeglich Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig
Ich habe den BOOL in der Header definiert. Die Sort funktion rufe ich in der CPP auf und dann bekomme ich diesen Fehler!!
Ich dreh noch durch!!!
-
BOOL
Keine Ahnung was du da gemachst hast. Aber eine Blick auf den Quellcode hilft
manchmal weiter.mfg JJ
-
Also den operator hab ich in List.h
List.h struct tOrder { int m_iOrderNr; int m_iStartTime; char m_cStartPoint; char m_cStopPoint; int m_iRate; //Datenmenge char m_cUnit; //Datenmenge ( G M K ) }; bool Startpunkt(const tOrder& a, const tOrder& b) { return a.m_iStartTime < b.m_iStartTime; }
Dann hab ich in einer anderen Klasse die Sortier Funktion
List.cpp for( itForward = Leli.begin(); itForward != --Leli.end() ; ) { iOrderFirst = (*itForward)->iStartTime; printf("%i", iOrderFirst); itForward++; iOrderSecond = (*itForward)->iStartTime; printf("%i", iOrderSecond); } Leli.sort(Startpunkt);
Und wenn ich das so mach bekomme ich den Fehler
-
Wie schon gesagt. es gibt bereits ne sort()-Funktion in std::list. Du musst nur
den Operator < deiner Struct überschreiben bzw. in deinem Fall überhaupt
definieren. und schon geht das Ganze.mfg JJ
-
Sorry ich stehe gerade voll auf dem Schlauch kannst du mir da weiter helfen???
Wäre dir da sehr dankbar
-
Reden wir überhaupt beide von einer std::list ????
mfg JJ
-
Ja klar reden wir von einer list!!
Aber ich weiß nicht warum ich diese Sort-Funktion mit meinem definierten Operator nicht verwenden kann?? Keine Ahnung.
Wo meinst du das ich mir eine Funktion schreiben soll um sie dann in meinem Sort zu verwenden???Gruß Michel
-
#include <iostream> #include <list> using namespace std; typedef struct tOrder { int m_iOrderNr; int m_iStartTime; char m_cStartPoint; char m_cStopPoint; int m_iRate; char m_cUnit; // Es sollte natürlich ein Konstruktor // zur Initialisierung definiert werden !!! bool operator< (const struct tOrder& item) { return m_iStartTime < item.m_iStartTime; } } TORDER; int main(void) { list<TORDER> mylist; TORDER mydata1; mydata1.m_iStartTime = 10; mylist.push_back(mydata1); TORDER mydata2; mydata2.m_iStartTime = 1; mylist.push_back(mydata2); TORDER mydata3; mydata3.m_iStartTime = 7; mylist.push_back(mydata3); list<TORDER>::iterator it; for (it = mylist.begin(); it != mylist.end(); it++) cout << it->m_iStartTime << endl; mylist.sort(); for (it = mylist.begin(); it != mylist.end(); it++) cout << it->m_iStartTime << endl; return 0; }
mfg JJ
-
template<> bool std::greater<tOrder>::operator()(tOrder const& lhs,tOrder const& rhs) const { return lhs.m_iStartTime > rhs.m_iStartTime; } Leli.sort(std::greater<tOrder>());