Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[std::vector, C++] Sortowanie tablicy za pomocą funckji std::sort (STL Algorithms)

Ostatnio zmodyfikowano 2010-08-13 20:36
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
[std::vector, C++] Sortowanie tablicy za pomocą funckji std::sort (STL Algorithms)
» 2010-08-13 18:09:12
witam. zabralem sie za program, ktory bedzie sortowal wektor wg jednej ze zmiennych.

ulozylem go tak, ze mam mozliwosc sortowania za pomoca roznych algorytmow (ten co sam wymyslilem, pewnie najmniej wydajny - wyszlo ze to sie nazywa babelkowe, czyli porownuje element i,i+1 i przesuwam jesli trzeba, i tak kilka przejsc od nowa), dodatkowo dopisze bardziej efektywne algorytmy.

tutaj chcialbym prosic o pomoc, bo chcialem dopisac algorytm sort z <algorithm>, w dokumentacji c++ znalazlem jak go uzyc, jednak mam problem z okresleniem funkcji comp
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
, poniewaz przyklad na stronce jest dla int'ow, gdzie funkcja wyglada dosc prosto
bool myfunction (int i,int j) { return (i<j); }
, dla wektora juz sie tak nie da. oczywiscie najpierw zasiegnalem wiedzy na google, gdzie znalazlem podpowiedz, aby samemu zbudowac funkcje - komparator, ale niestety jeszcze nie potrafie i prosze o podpowiedz, jak czytac ten kod:
C/C++
template < typename T1, typename T2 >
struct komparator {
    T1 T2::* mem_ptr;
    komparator( T1 T2::* _mem_ptr )
        : mem_ptr( _mem_ptr )
    { }
    bool operator ()( const T2 & x, const T2 & y ) const {
        return x.* mem_ptr < y.* mem_ptr;
    }
};

wiem tyle, ze tworzymy szablon oraz ze? przeciazamy operator()... dodatkowo, ze uzywamy tu czegos z biblioteki boost?(bo szukalem, co to te mem_ptr i polaczylo mnie ze stronka boost, ale nie znam zupelnie tej biblioteki, chociaz na pewno za nia sie wezme niedlugo)

dlatego prosze o podpowiedz, co sie w tym kodzie dzieje oraz podpowiedz, jak go przeksztalcic, aby  vektor<struktury*> W1 mozna bylo sortowac wg dowolnej zmiennej struktury;
P-20796
ison
» 2010-08-13 18:35:32
jako trzeci argument do funkcji sort() możesz podać jakąkolwiek funkcję zwracającą wartość logiczną. Według niej są sortowane zmienne. Standardowo (bo wcale nie musisz podawać trzeciego argumentu przy np. sortowaniu zwykłej tablicy int'ów) zwraca wartość logiczną true jeśli pierwszy element jest mniejszy od drugiego (taki zwyczajny operator mniejszości). Jeśli chcesz posortować na przykład klasę to już musisz sobie sam taką funkcję napisać.

kodzik:
C/C++
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

class Foo
{
public:
    int zmienna; //względem tej zmiennej będziemy sortować
   
    Foo( int nowa_zmienna ) //konstruktor
    {
        zmienna = nowa_zmienna;
    }
    Foo() { } //konstruktor
    ~Foo() { } //destruktor
};
vector < Foo > MyVector; //tworzymy vektor klas Foo

bool mniejsze( Foo PierwszyFoo, Foo DrugiFoo ) //funkcja mówiąca który element i w jakim wypadku jest mniejszy od drugiego
{
    return PierwszyFoo.zmienna < DrugiFoo.zmienna; //zwraca wartość logiczną, sortujemy względem zmiennej o nazwie 'zmienna'
   
    /*powyższy return jest równoznaczny z tym kodem:
         if(PierwszyFoo.zmienna<DrugiFoo.zmienna) return true;
         else return false;
         */
}

int main()
{
    //wrzucamy jakieś losowe wartości
    MyVector.push_back( Foo( 5 ) );
    MyVector.push_back( Foo( 3 ) );
    MyVector.push_back( Foo( 7 ) );
    MyVector.push_back( Foo( 1 ) );
    MyVector.push_back( Foo( 1654645 ) );
   
    //sortujemy z użyciem funkcji 'mniejsze'
    sort( MyVector.begin(), MyVector.end(), mniejsze );
   
    //wypisujemy posortowany wektor
    for( unsigned int i = 0; i < MyVector.size(); ++i ) printf( "%d\n", MyVector[ i ].zmienna );
   
    while( 1 );
   
}
P-20798
dmx81
Temat założony przez niniejszego użytkownika
» 2010-08-13 20:36:27
dzieki wielkie ison za obszerna odpowiedz :) wczesniej kombinowalem podobnie, ale nie wiem sam czemu - zamiast do funkcji przekazac obiekt klasy, wrzucalem... wektor:p chyba zasugerowalem sie tym, ze wektor.begin(), wektor.end... no i dawalem wektor.zmienna i wywalalo blad, wiec pomyslalem, ze tak nie da rady, ale to juz z przemeczenia;) dzieki jeszcze raz za podpowiedz

ps. swoja droga, pewnie jak sie uporam z innymi sprawami, sprobuje rozszyfrowac ten kod, co wyzej wkleilem
P-20800
« 1 »
  Strona 1 z 1