2016-06-13 11 views
-1

Ich habe einen Vektor mit 3 Spalten.Sortierung Vektor nach der dritten Nummer in Spalte

{0,1,10} 
{0,2,15} 
{0,3,33} 
{0,4,12} 

Wie kann ich das nächste Ergebnis erhalten?

{0,3,33} 
{0,2,15} 
{0,4,12} 
{0,1,10} 

Wie ich denke, dass ich den folgenden Code verwenden sollte:

std::sort(a.begin(), a.end(), 
    [](const std::vector<int>& a, const std::vector<int>& b) 
    { return a[1] > b[1]; }); 

Also muss ich in jedem Vektor gemäß der dritten Reihe sortieren, aber zuerst zwei auch gehen sollte, weil ich eine Liste müssen mit sortierter Vektor.

+1

'nach dem dritten und number'' Rück a [1]> b [1] '? – Gluttton

Antwort

3

In Ihrem Lambda, das zum Vergleichen von Elementen des primären Vektors verwendet wird, überprüfen Sie zweite Elemente, nicht dritte. Außerdem vergleichen Sie keine anderen Werte. Also, wenn Sie textlich schreiben, was Sie wollen:

v1 größer als v2:

  • wenn v1 drittes Element größer als v2 drittes Element
  • oder wenn v1 drittes Element ist gleich als v2 drittes Element und v1 zweites Element größer ist als v2 zweites Element
  • von 2, wenn letztem Elemente von V1 und V2 und V1 equals erstem Elemente größer als v2 erstes Element

übersetzen Gerade es c + +:

http://coliru.stacked-crooked.com/a/44fff0423ff6ca6b

std::sort(a.begin(), a.end(), 
    [](const std::vector<int>& a, const std::vector<int>& b) 
     { 
      return a[2] > b[2] // Note here 2 instead of 1 
       || (a[2] == b[2] && a[1] > b[1]) 
       || (a[2] == b[2] && a[1] == b[1] && a[0] > b[0]); 
     }); 
+0

Vielen Dank. Ihre Antwort ist, wonach ich gesucht habe! –

1

Ja, aber Sie können auch ein funktionelles Objekt wie dieses verwenden. Lambas und Funktionen arbeiten langsamer, als funktionale Objekte in diesem Kontext. Funktionsobjekt ist die beste Lösung

class my_compare_class 
{ 
public: 
    inline bool operator()(const std::vector<int> &a, const std::vector<int> &b) 
    { 
     // Third column is 2-nd index, because counting was started from 0 
     return a[2] > b[2]; 
    } 
}; 

Mit std::sort(a.begin(),a.end(),my_compare_class());

EDIT: Added mit Beispiel.

+0

Das würde in der entgegengesetzten Richtung sortieren, wie gefragt ... – Aconcagua

+0

@Aconcagua oops ... – Inline

+0

und es als 'std :: sort (a.begin(), a.end(), meine_compare_class());' –

Verwandte Themen