2015-12-13 19 views
8

Ho un contenente oggetti della classe Foo. Supponiamo che Foo disponga di una variabile membro int x e che sia stata implementata anche una funzione CompareInts(int a, int b) che restituisce il minimo di a e b. Quindi, potrei fare un std::sort vettore in termini di valori dell'oggetto x.Ordinamento di un vettore utilizzando i valori in un altro vettore

Tuttavia, quello che se questi valori non sono x variabili membro di Foo, ma sono in un altro std::vector chiamato x_vec. Qui, il primo elemento di x_vec corrisponde al primo elemento di foo_vec e così via. Come posso eseguire uno std::sort su foo_vec in base ai valori corrispondenti in x_vec?

+0

Esiste un requisito per mantenere l'ordine 'x_vec'? – legends2k

+0

No, va bene se x_vec' è riordinato. – Karnivaurus

+0

Sto votando per chiudere questa domanda come off-topic perché manca un esempio minimo. – gsamaras

risposta

4

È possibile creare un terzo vettore di indici e ordinarlo indirettamente. Dopo che è ordinato, è possibile accedere al vettore originale attraverso gli indici ordinati:

std::vector<Foo> foo_vec = /* ... */; 
std::vector<int> x_vec = /* ... */; 
std::vector<std::size_t> index_vec; 

assert(foo_vec.size() == x_vec.size()); 
for (std::size_t i = 0; i != foo_vec.size(); ++i) { index_vec.push_back(i); } 

std::sort(
    index_vec.begin(), index_vec.end(), 
    [&](std::size_t a, std::size_t b) { return x_vec[a] < x_vec[b]; }); 

for (std::size_t i = 0; i != index_vec.size(); ++i) 
{ 
    std::cout << "Sorted element " << i << " is " 
       << foo_vec[index_vec[i]] << "\n"; 
} 

Si noti che questa operazione è del tutto non invasivo, in quanto tutto avviene in modo indiretto.

+0

Ecco un [collegamento] (http://stackoverflow.com/a/1267878/4859885) a un buon algoritmo per riordinare i vettori in base agli indici –

+0

La classe di Foo ha bisogno di sovraccaricare l'operatore << '' Penso che – Elyasin

+0

@Elyasin: Sure , era solo per dimostrare come accedere all'elemento. –

2

Si crea un terzo vettore di int, che sono gli indici nei due vettori originali. Inizialmente popola il terzo vettore con il numero 0 .. lunghezza del vettore. Quindi costruisci la tua funzione di confronto per prendere l'indice dal terzo vettore e poi fai il confronto con il secondo vettore che tiene le chiavi.

I dati nel primo e nel secondo vettore non verranno modificati (il che è buono) e i valori nel terzo vettore rappresenteranno l'ordinamento una volta eseguito.

Problemi correlati