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

Sortowanie pola struktury (tab char) w wektorze

Ostatnio zmodyfikowano 2013-12-24 13:58
Autor Wiadomość
Kefirek
Temat założony przez niniejszego użytkownika
» 2013-12-24 13:00:50
Do Adik80
No właśnie chciałbym aby funkcja sort sortowała mi nazy( tab czar ) uwzględniając całe wyrazy.
czyli jak wprowadzę kolejno klientów o nazwie aba, aca, aaa. To program mi sortuje tak: aba, aca, aaa.
Powinno(chciałbym aby sortowało) sortować: aaa, aba, aca.
Pozdrawiam i czekam na sugestie
Kefirek
P-100033
Kefirek
Temat założony przez niniejszego użytkownika
» 2013-12-24 13:11:15
Do DejaVu:
No dobra "i" i "k",  a co jeśli chodzi o sortowanie????
Pozdrawiam Kefirek
P-100035
pekfos
» 2013-12-24 13:19:18
Zamiast j użyj std::min(x.nazwa.size(), y.nazwa.size()). A najlepiej po prostu zrób tak:
C/C++
return x.nazwa < y.nazwa;
(zakładam, że nazwa jest typu std::string)
P-100036
Kefirek
Temat założony przez niniejszego użytkownika
» 2013-12-24 13:33:23
Do Pekfos
Niestety nazwa jest polem struktury tablicą typ char.
Pozdrawiam
Kefirek
P-100046
DejaVu
» 2013-12-24 13:42:26
Ja bym do sortowania zalecał użyć std::sort, czyli:
C/C++
std::sort( wektor.begin(), wektor.end() );
Jeżeli struktura danych w std::vector jest złożona i nie ma ona przeciążonego operatora < to wówczas trzeba dopisać sobie predykat binarny, tj.
C/C++
bool porownajWektory( const TypDanych & dane1, const TypDanych & dane2 ) { return dane1.nazwa < dane2.nazwa; }

//i wywołać:
std::sort( wektor.begin(), wektor.end(), porownajWektory );

/edit:
http://cpp0x.pl/dokumentacja​/predykat/326
P-100057
pekfos
» 2013-12-24 13:45:33
Niestety nazwa jest polem struktury tablicą typ char.
W takim razie..
C/C++
return std::string( x.nazwa ) < std::string( y.nazwa );
Lub tak:
C/C++
return std::string( x.nazwa ) < y.nazwa;
Zakładając, że trzymasz tam tekst w formie c-stringa.
P-100058
Kefirek
Temat założony przez niniejszego użytkownika
» 2013-12-24 13:46:57
Do DejaVu

No właśnie tak mam zrobione:
C/C++
void Odczyt_do_ekranu() //wczytanie z pliku do pól struktury i odczyt na ekran
{
   
    ifstream do_ekranu( "Kontrahenci.txt", ios::in | ios::beg | ios::binary );
   
    klient kup;
    cout << "Odczyt z pliku : " << endl;
    while( do_ekranu.read(( char * ) & kup, sizeof( kup ) ) )
    {
        vektor.push_back( kup );
       
        cout << vektor[ j ].nazwa << endl;
        cout << vektor[ j ].kg << endl;
        cout << vektor[ j ].price << endl;
        ++j;
    }
   
    sort( vektor.begin(), vektor.end(), Ksort );
    cout << "Po sortowaniu :" << j << endl;
    for( int i = 0; i < j; i++ )
         cout << vektor[ i ].nazwa << endl;
   
}

bool Ksort( const klient & x, const klient & y )
{
   
   
    for( int i = 0; i < j; i++ )
    if( x.nazwa[ i ] < y.nazwa[ i ] )
         return true;
    else
         return false;
   
}

ale funkcja Ksort nie sełnia moich oczekiwań to znaczy jak wprowadzę klienta o nazwie aab a potem aaa to sortowanie wygląda tak(kolejność) aab, aaa, a powinno być odwrotnie czyli aaa, aab.
Pozdrawiam
Kefirek
P-100060
DejaVu
» 2013-12-24 13:49:30
C/C++
bool Ksort( const klient & x, const klient & y )
{
    return x.nazwa < y.nazwa;
}
Jeżeli dane sortują się w odwrotnej kolejności niż byś chciał, to:
C/C++
bool Ksort( const klient & x, const klient & y )
{
    return x.nazwa > y.nazwa;
}
/edit:
Jeżeli nazwa nie jest std::string, tylko char nazwa[123] to użyj:
C/C++
return strcmp( x.nazwa, y.nazwa ) < 0;
//lub odpowiednio:
return strcmp( x.nazwa, y.nazwa ) > 0;
P-100061
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona