tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
4020
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    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?
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  3. #3
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    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
     

  4. #4
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    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?
     

  5. #5
    Teambeta Teambeta ist offline Mitglied Gold
    Registriert seit
    Apr 2004
    Beiträge
    207
    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.
     

  6. #6
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    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.
     

  7. #7
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    du könntest statt der Struktur eine Klasse verwenden:
    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;
    };
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Thomasio Beitrag anzeigen
    Es hilft alles nichts, denn gerade eben habe ich rausgefunden woran es liegt.
    Es ist ein bekanntes Problem von GCC++
    Das glaube ich nicht.
    Zitat Zitat von Thomasio Beitrag anzeigen
    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.
    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.

  9. #9
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    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.
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Thomasio Beitrag anzeigen
    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.
    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.

    Code cpp:
    1
    2
    3
    
    bool operator< (const struct& a, const struct& b) {
      return (a.y < b.y);
    }
    Alternativ kann man ebenfalls als 3-ten Parameter bei der std::sort eine Komparatorfunktion angeben.

    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

  1. Liste für 2 Structs
    Von Need_Name im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 04.01.10, 14:49
  2. Binary Insertion Sort vs. Insertion Sort
    Von Dolphon im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 05.01.09, 19:47
  3. Antworten: 4
    Letzter Beitrag: 15.10.07, 21:52
  4. Vector in Vector geht nicht
    Von TimN im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 10.05.07, 19:19
  5. eigenes JTable Modell mit Übernahme des Vector Vector Konstruktors
    Von Malte Roessner im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 8
    Letzter Beitrag: 02.06.06, 12:31