2016-05-04 11 views
0

Ich versuche, einen Vektor nach mehreren Spalten zu sortieren. Also ist mein Vektor, wo Zeilen die Anzahl der Zeilen ist. Da ich den Vektor in einer For-Schleife für verschiedene Größen verwende, muss er dynamisch sein.Sortierung Vecor durch mehrere Spalten

vector<vector<double> > matrix; 
matrix.resize(rows); 
for(size_t i=0; i<rows; i++) { 
    matrix[i].resize(3); 
} 

Nachdem der Vektor eingerichtet ist, fülle ich ihn mit Daten. Die Daten bestehen aus Koordinaten (xyz).

for(size_t i = 0;i<lss.size();i+2) { 
      int k = i+1; 
      matrix[i][0]=lss[i].v[0].x; 
      matrix[i][1]=lss[i].v[0].y; 
      matrix[i][2]=lss[i].v[0].z; 
      matrix[k][0]=lss[i].v[1].x; 
      matrix[k][1]=lss[i].v[1].y; 
      matrix[k][2]lss[i].v[1].z; 
    } 

Bis jetzt funktioniert alles gut. Aber als nächstes muss ich den Vektor sortieren. Was ich aus meinen Daten weiß, ist die Z-Koordinate ist immer die gleiche, für eine Schleife Passage. Also müsste ich den Vektor zuerst sortieren und dann nach der zweiten Spalte. Ich suche bereits nach Sortierfunktionen wie std: sort, ich konnte nichts passendes finden. Mein Versuch war dies:

int compare(vector<double>& s1, vector<double>& s2) 
{ 
    return s1[0] < s2[0]; 
} 
std::sort(matrix.begin(), matrix.end(), compare); 

Aber das Ergebnis war das gleiche wie die Eingabe.

So ist die unsortierte Ausgabe sieht wie folgt aus:

X=-5.000000, Y=2.000000, Z=-2.000000 
X=-5.000000, Y=-5.000000, Z=-2.000000 
X=5.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=5.000000, Y=5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=-5.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=-5.000000, Y=-5.000000, Z=-2.000000 

Was ich will, ist:

X=-5.000000, Y=-5.000000, Z=-2.000000 
X=-5.000000, Y=-5.000000, Z=-2.000000 
X=-5.000000, Y=2.000000, Z=-2.000000 
X=-5.000000, Y=5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=5.000000, Z=-2.000000 
+0

Der Rückgabetyp Ihrer Vergleichsfunktion sollte 'bool' sein. Aber das sollte nicht verhindern, dass die Sorte funktioniert. Bitte poste MCVE, was kopiert, eingefügt und ausgeführt werden kann. – SergeyA

Antwort

3

Da Sie auf den ersten beiden Spalten sortieren wollen, muss die Vergleichsfunktion beide verwenden Werte. Ändern Sie auch den Rückgabetyp compare zu bool und die Argumenttypen zu const&.

bool compare(vector<double> const& s1, vector<double> const& s2) 
{ 
    // If the values of the first column are not equal, 
    // just use them to order s1 and s2. 
    if (s1[0] != s2[0]) 
    { 
     return s1[0] < s2[0]; 
    } 

    // If the values of the first column are equal, 
    // use the values of the second column to order s1 and s2. 
    return s1[1] < s2[1]; 
} 
+0

Danke Ich habe versucht, Ihren Tipp, und es hat perfekt funktioniert. – user3794592

+0

@ user3794592, froh, dass es funktioniert hat. –

Verwandte Themen