std::vector sortieren

$nooc

Mitglied
Hi Leute,

was wäre denn eine schnelle, einfache lösung einen std::vector zu sortieren?
Die Liste besteht aus Objekten die eine Gruppennummer, sowie eine fortlaufende ID haben.
Die Objekte sollen primär nach der Gruppennummer und sekundär nach der ID
sortiert werden. Kann mir das jemand Helfen?

lG
 
Eine Frage hätte ich noch. Ich habe folgende Funktion:
C++:
template <typename t>
class SortableVector{
    ...
    vector<t> vec;
    ...
    void sort(){
        std::sort(vec.begin(), vec.end());
    }
    ...
}
Dann wird beim Sortieren jeder Wert des Vectors 0.


So:
C++:
template <typename t>
class SortableVector{
    ...
    bool compare(t x, t y){
        return x<y;
    }
    ...
    vector<t> vec;
    ...
    void sort(){
        std::sort(vec.begin(), vec.end(),  &SortableVector<t>::compare);
    }
    ...
}
Es kommt dieser Fehler:
error C2064: Ausdruck ergibt keine Funktion, die 2 Argumente übernimmt
Woran liegt das?
 
Also um es richtig zu verstehen: Bei der oberen Version führt das sort() dazu, dass alle Werte 0 werden?
Unten weiß ich nicht, warum du das ganze als &SortableVector<t>::compare und nicht ohne & übergibst.
Interessant wäre, auf welche Zeile sich der Error bezieht.

Gruß,

badday
 
Richtig, alles wird 0.
Wenn ich das & weglasse, kommt der Fehler
error C3867: "SortableVector<t>::compare": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&SortableVector<t>::compare", um einen Zeiger auf den Member zu erstellen.
...
error C2780: 'void std::sort(_RanIt,_RanIt)': Erwartet 2 Argumente - 3 unterstützt


Bei der Version mit & wird auf die Zeile 3191 in der Header-Datei "algorythm" verwiesen...
 
Ich muss gestehen, nicht zu wissen woran es liegt.
Allerdings denke ich, dass ich eine alternative Lösung habe:


Code:
template <typename t>
class comp
{
    public:
    bool operator() (const t &a, const t &b) const //Funktionsobjekt
    {
        return a<b;
    }
};


template <typename t>
class Svec
{
    
    comp<t> criterion;
    vector<t> vec;

    void sort()
    {
        std::sort(vec.begin(), vec.end(), criterion);
    }

...
};


Gruß,

badday
 
Vielen Dank für die Lösung, nach sehr langem Probieren habe ich jetzt die erfolgreich gezogenen Lottozahlen bekommen. :D
Hier sind sie:
Lottozahlen: 4, 5, 9, 10, 15, 42
Das bringt zwar nichts, aber es kommt immerhin ein Ergebnis. ;)

// EDIT:
Es lag nicht an der Sortierung, sondern der vorherigen Zuweisung des Vektors. ;)
Inzwischen sortiert das Programm nicht mehr nach 0. :)
 
Eine Frage hätte ich noch. Ich habe folgende Funktion:
C++:
template <typename t>
class SortableVector{
    ...
    vector<t> vec;
    ...
    void sort(){
        std::sort(vec.begin(), vec.end());
    }
    ...
}
Dann wird beim Sortieren jeder Wert des Vectors 0.
Kann ich absolut nicht nachvollziehen:
C++:
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

template <typename t>
class SortableVector{
  public:
    vector<t> vec;
    void sort(){
        std::sort(vec.begin(), vec.end());
    }
};

int main(void) {
  SortableVector<int> sv;
  sv.vec.push_back(3);
  sv.vec.push_back(2);
  sv.vec.push_back(1);
  sv.sort();
  for (std::vector<int>::const_iterator it = sv.vec.begin(); it != sv.vec.end();
       ++it) {
    cout << *it << endl;
  }
  return 0;
}
Ergibt bei mir die Ausgabe:
Code:
1
2
3
Dein Fehler muss woanders liegen. \edit: Hab grade gesehen, dass sich dieses Problem schon geklärt hat. Ich lass es der Vollständigkeit halber trotzdem stehen.


So:
C++:
template <typename t>
class SortableVector{
    ...
    bool compare(t x, t y){
        return x<y;
    }
    ...
    vector<t> vec;
    ...
    void sort(){
        std::sort(vec.begin(), vec.end(),  &SortableVector<t>::compare);
    }
    ...
}
Es kommt dieser Fehler:

Woran liegt das?
Du holst dir hier einen Zeiger auf eine Klassenmethode, da compare eine Instanzmethode ist. Deklariere die Funktion static, wenn du es unbedingt so machen willst. Der Aufruf von sort mit zwei Parametern macht aber auch nichts anderes.

\edit2:
Code:
template <typename t>
class comp
{
    public:
    bool operator() (const t &a, const t &b) const //Funktionsobjekt
    {
        return a<b;
    }
};
Dieses Template gibt es bereits in des Standardbibliothek, hört dort auf den Namen std::less und wohnt im Header <functional>.

Grüße,
Matthias
 
Zuletzt bearbeitet:
Zurück