ERLEDIGT
JA
JA
ANTWORTEN
9
9
ZUGRIFFE
4020
4020
EMPFEHLEN
-
Ich habe ein struct:
Code :1 2 3 4 5 6 7 8
struct Members { int id; std::string name; std::string nick; };
die sammle ich in einem Vector
Code :1
std::vector<Members>MyMembers;
wenn ich jetzt den vector nach Namen sortieren möchte
Code :1
std::sort(MyMembers.begin(), MyMembers.end(), membersort);
dann ist schon Essig, ganz egal was in der membersort Funktion steht, allein der Aufruf von std::sort bringt mir 1000 Compiler Errors, fast alle aus stl_algo.h
Die header sind alle eingebunden und in ein paar Beispielen im Web zum gleichen Thema, finde ich nichts was dort anders gemacht würde, bzw. ich sehe es nicht.
Was mache ich denn falsch?
-
Poste doch wenigstens mal die ersten 2 oder 3 Fehlermeldungen. An deinem Code fällt mir sonst nichts auf.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_algo.h:2506: instantiated from `void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Members*, std::vector<Members, std::allocator<Members> > >, _Size = int, _Compare = bool (*)(std::string, std::string)]'
in dem Stil, 100te davon
-
Nach ein wenig experimentieren, bin ich inzwischen so weit:
Ich kann alle möglichen vector sortieren, solange kein struct drin ist.
Ist es möglich, dass mir doch irgendein header fehlt, oder ein linker Eintrag?
Was braucht std::sort denn zusätzlich, wenn im vector ein struct drin ist?
-
Versuch es doch mal mit std:
air und std::vector.
Und zwar machst du einmal ein std::string und einmal deine Struktur in ein std:
air rein, wobei die std::string Variable eher temporär wär.
Diese Variable zeigt, jenachdem was du gerade willst ( nick/name ), auf einen Wert des anderen std::string der Struktur, und dann ordnest du die einfach so.
Ich hoffe du hast verstanden, was ich verscuht habe zu erklären.
Mit freundlichen Grüßen.
-
Es hilft alles nichts, denn gerade eben habe ich rausgefunden woran es liegt.
Es ist ein bekanntes Problem von GCC++
Code :1 2 3 4 5 6 7 8
struct x { int y; } std::vector<x>z; std::sort(z.begin(), z.end());
ist mit GCC++ nicht machbar, zumindest habe ich ausser dem Hinweis, dass es ein GCC Problem ist nichts gefunden, wie man das Problem umgehen könnte.
Ich arbeite gerade an einem workaround, der die Elemente sortiert, bevor sie ins struct kommen, schätze das ist einfacher.
Trotzdem danke an alle.
-
Hallo,
du könntest statt der Struktur eine Klasse verwenden:
GrußCode cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
class CMembers { public: CMembers::CMembers() { } // Standardkonstruktor CMembers::CMembers(const CMembers& oMembers) // Kopierkonstruktor { id = oMembers.id; name = oMembers.name; nick = oMembers.nick; } int id; std::string name; std::string nick; };
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
17.03.08 10:43 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.Das glaube ich nicht.
Das kann nicht gehen, wenn keine Halbordnung auf den Elementen des Vektors definiert ist. Du müßtest den operator< für das struct x implementieren, dann kann auch mit std::sort sortiert werden.
Gruß
PS: Zeig am besten den vollständigen Code (vor allem wie membersort definiert ist) und die vollständigen Fehlermeldungen - der Ausschnitt den du gezeigt hast, sagt nichts aus, es steckt ja noch nichtmal die Fehlermeldung drin!If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ich bin ja immer noch am lernen, ohne echten Sinn.
Sprich ich nehme mir ein Thema, im Moment sortieren, lerne mal die Grundzüge und baue es dann aus, im Moment bin ich also beim sortieren von structs, wobei structs ebenfalls neu für mich ist.
Darum baue ich mir zu Anfang die einfachst mögliche Testanwendung, meist ein leeres Fenster mit ein paar MessageBoxen, und weil dies in diesem Fall schon damit nicht ging habe ich sie noch weiter vereinfacht, um der Sache auf den Grund zu gehen.
Im Moment sieht der komplette Code meiner Anwendung also so aus:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#include <windows.h> #include <sstream> #include <vector> #include <iterator> #include <cctype> #include <algorithm> struct x { int y; } std::vector<x>z; int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow) { std::sort(z.begin(), z.end()); return 0; }
Wenn ich da jetzt "den operator< für das struct x implementieren" muss, dann verstehe ich erstmal Bahnhof, denn das kenne ich noch nicht, solange ich keine structs im Vector hatte, bin ich über dieses Problem noch nicht gestolpert.
-
17.03.08 15:38 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Für die Basistypen ist ja auch der operator< definiert, somit eine Halbordnung auf den jeweiligen Typen und man kann Objekte entsprechend sortieren.
Wie sollten denn jetzt Instanzen einer benutzerdefinierte Datenstruktur verglichen werden? Das kann der Compiler ja schlecht erraten - selbst wenn es sich um eine so einfache Datenstruktur handelt wie deine.
Alternativ kann man ebenfalls als 3-ten Parameter bei der std::sort eine Komparatorfunktion angeben.Code cpp:1 2 3
bool operator< (const struct& a, const struct& b) { return (a.y < b.y); }
Gruß
PS: Übrigens fehlt ein Semikolon nach der struct Deklaration.If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
Liste für 2 Structs
Von Need_Name im Forum C/C++Antworten: 8Letzter Beitrag: 04.01.10, 14:49 -
Binary Insertion Sort vs. Insertion Sort
Von Dolphon im Forum C/C++Antworten: 2Letzter Beitrag: 05.01.09, 19:47 -
[c++] Problem mit STL (list, vector sort(),etc..)
Von radazong im Forum C/C++Antworten: 4Letzter Beitrag: 15.10.07, 21:52 -
Vector in Vector geht nicht
Von TimN im Forum C/C++Antworten: 3Letzter Beitrag: 10.05.07, 19:19 -
eigenes JTable Modell mit Übernahme des Vector Vector Konstruktors
Von Malte Roessner im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 8Letzter Beitrag: 02.06.06, 12:31





Zitieren

Login






