sort vector von structs

Thomasio

Erfahrenes Mitglied
Ich habe ein struct:

Code:
struct Members
{

int id;
std::string name;
std::string nick;

};

die sammle ich in einem Vector

Code:
std::vector<Members>MyMembers;

wenn ich jetzt den vector nach Namen sortieren möchte

Code:
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
 
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::pair und std::vector.

Und zwar machst du einmal ein std::string und einmal deine Struktur in ein std::pair 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:
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:
C++:
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
 
Hi.
Es hilft alles nichts, denn gerade eben habe ich rausgefunden woran es liegt.
Es ist ein bekanntes Problem von GCC++
Das glaube ich nicht.
Code:
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!
 
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:
#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.
 
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:
#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.

C++:
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.
 
Zurück