2013-02-03 20 views
5

Che ci crediate o no, quando cerco questo, arrivo con nada.vettore vettoriale multidimensionale di ints?

Come è possibile ordinare uno vector multidimensionale di int da una delle "colonne"?

Molte grazie in anticipo!

C++

res = mysql_perform_query(conn, "SELECT column1, column2, column3 FROM table1;"); 
std::vector< std::vector<int> > myVector; 
while ((row = mysql_fetch_row(res)) !=NULL){ 
    int rankedID = atoi(row[0]); 
    std::vector<int> tempRow; 
    tempRow.push_back(atoi(row[0])); 
    tempRow.push_back(atoi(row[1])); 
    tempRow.push_back(atoi(row[2])); 
    myVector.push_back(tempRow); 
} 

vorrei ordinare myVector da myVector[i][1] discendente.

Grazie ancora!

+1

Usare i tasti [algoritmo di ordinamento ] (http://en.cppreference.com/w/cpp/algorithm/sort) dalla libreria standard? –

+0

E fornire un confronto appropriato. – jxh

+0

@ R.MartinhoFernandes ti dispiacerebbe fornire un esempio di codice? posso ordinare un vettore 1d, ma non ho visto un esempio per un 2d nel link u fornito –

risposta

8

È questo quello che vuoi?

std::sort(myVector.begin(), myVector.end(), [](const std::vector<int>& a, const std::vector<int>& b){ return a[1] > b[1]; }); //If you want to sort in ascending order, then substitute > with <. 

Ho visto il codice con gli occhi. Non l'ho ancora provato. Si noti che è necessario un compilatore C++ 11 per ottenere la compilazione di questo codice.

MODIFICA: errore di sintassi corretto.

MODIFICA: testato. Funziona. ecco il codice per il test:

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main(){ 
    std::vector< std::vector<int> > myVector({{3,4,3},{2,5,2},{1,6,1}}); 
    std::sort(myVector.begin(), myVector.end(), [](const std::vector<int>& a, const std::vector<int>& b){ return a[1] > b[1]; }); 

    std::cout << "{"; 
    for(auto i : myVector){ 
     std::cout << "["; 
     for(auto j : i) 
      std::cout << j << ","; 
     std::cout << "],"; 
    } 
    std::cout << "}" << std::endl; 
    return 0; 
} 

output del programma:

{[1,6,1,],[2,5,2,],[3,4,3,],} 

EDIT: cambiata la funzione lambda ad accettare di riferimento const su proposta del Blastfurnace

+0

Il tuo lambda dovrebbe prendere quei parametri come 'const riferimento' per evitare costose copie. – Blastfurnace

+0

mi ha dato 'espressione primaria prevista prima â [â token',' espressione primaria attesa prima â] â token', 'espressione primaria prevista prima di âaâ', e' espressione primaria prevista prima âbâ' –

+0

@JoeCoderGuy che è strano. Sembra che tu abbia inserito il carattere 'â' accidentalmente nel codice. –

4

Il mio suggerimento è uso struct per la tavola però:

struct Table 
{ 
    Table(int c1, int c2, int c3) 
    : column1(c1), 
    column2(c2), 
    column3(c3) 
    { 
    } 

    int column1; 
    int column2; 
    int column3; 
}; 

mettere ogni riga dal DB in una struct poi conservarlo nel vettore:

std::vector<Table> myVector; 
while ((row = mysql_fetch_row(res)) !=NULL) 
{ 
    myVector.push_back(Table(atoi(row[0]), atoi(row[1]), atoi(row[2])); 
} 

Ora è possibile ordinare vettore per qualsiasi colonna

#include <algorithm> 
struct 
{ 
    bool operator()(const Table& lhs, const Table& rhs) 
    { 
     return lhs.column2 > rhs.column2; 
    } 
} ColumnLess; 

std::sort(myVector.begin(), myVector.end(), ColumnLess); 

Se si utilizza C++ 11, potrebbe usare lambda così:

std::sort(myVector.begin(), myVector.end(), 
     [](const Table& lhs, const Table& rhs){return lhs.column2 < rhs.column2;}); 
+0

@JoeCoderGuy vedere la mia risposta aggiornata con sort – billz

+0

sorprendente esempio! per curiosità, perché preferiresti questo su a20365354 (assumendo le sue opere)? –

+0

Non sono sicuro che il suo codice funzionerà su più dimensioni vettoriali o meno, non l'ho testato. – billz

Problemi correlati