2015-12-13 11 views
8

Mam std::vector o nazwie zawierający obiekty klasy Foo. Załóżmy, że Foo ma zmienną składową int x, a także zaimplementowałem funkcję CompareInts(int a, int b), która zwraca minimum a i b. Następnie mógłbym wykonać wektor w postaci wartości std::sort obiektu.Sortowanie wektora za pomocą wartości w innym wektorze

Co jednak jeśli te wartości x nie są zmiennymi składowymi Foo, ale są w innejo nazwie x_vec. Tutaj pierwszy element x_vec odpowiada pierwszemu elementowi foo_vec i tak dalej. Jak mogę wykonać std::sort na foo_vec w oparciu o odpowiednie wartości w x_vec?

+0

Czy istnieje wymóg utrzymania porządku "x_vec"? – legends2k

+0

Nie, to jest w porządku, jeśli 'x_vec' jest zmieniony. – Karnivaurus

+0

Głosuję, aby zamknąć to pytanie jako nie na temat, ponieważ brakuje w nim minimalnego przykładu. – gsamaras

Odpowiedz

4

Możesz zrobić trzeci wektor z indeksów i sortować to pośrednio. Po to sortowane, można uzyskać dostęp do oryginalnego wektora przez posortowanych indeksów:

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"; 
} 

pamiętać, że ta operacja jest całkowicie nieinwazyjna, ponieważ wszystko dzieje się w sposób pośredni.

+0

Oto [link] (http://stackoverflow.com/a/1267878/4859885) do ładnego algorytmu do reorganizacji wektorów na podstawie indeksów –

+0

Klasa Foo musi przeciążyć operator "<<", myślę, że – Elyasin

+0

@ Elyasin: Sure , to było tylko po to, żeby pokazać, jak uzyskać dostęp do elementu. –

2

Tworzysz trzeci wektor int, który jest indeksami do dwóch oryginalnych wektorów. Początkowo wypełnij trzeci wektor liczbą 0 .. długości wektora. Następnie skonstruuj funkcję porównania, aby pobrać indeks z trzeciego wektora, a następnie porównaj z drugim wektorem przytrzymującym klawisze.

Dane w pierwszym i drugim wektorze nie zostaną zmodyfikowane (co jest dobre), a wartości w trzecim wektorze będą reprezentować kolejność sortowania po wykonaniu.

Powiązane problemy