Jak sprawic zeby \'Ś\' bylo przed \'W\' - sortowanie string

0

Witam. Pytanie jak w temacie. Dodam ze chodzi o C++ i biblioteke MFC. Srodowisko visual studio .net 2003. Prosze o pomoc.

0

stwórz sobie tablice rekordów

struct znaki{
char znak;
char waga;
}
znaki tablica[300];

będziesz musiał wyznaczyć sobie wagi, ale potem będzie już gicior :d

Tak czy inaczej będziesz musiał napisać funkcje sortującą - parę if'ów w tą czy w tamtą

0

Ok, tak tez myslalem. Moze podpowiesz mi cos wiecej jak to zrobic? Uzywam ogolnie typu string z STL'a do operacji na strongach, tam chyba mzna jakos podpiac swoja funkcje porownujaca litery, nie wiem tylko jak. Dzieki za odpowiedz!

0

Ehmm, to się robi przez ustawienie locale, dokładnie sposobu porównywania łańcuchów, czyli collate.
W C: setlocale(), strcoll(), itp.
W C++: std::locale, std::collate<>, itp.

Zamieszcze mały przykładzik, z tym że pomieszane jest C i C++, bo nie mogę zmusić C++ do włączenia locale PL [?ktoś ma pomysł? żadne pl_PL polish, itp. nie działa, MinGW/Windows2k]:

#include <string>
#include <cstdlib>
#include <locale>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool comp(const string& s1, const string& s2)
{
    return (strcoll( s1.c_str(), s2.c_str() )==-1) ? true : false;
}

int main()
{
    // "polish_poland.1250" albo "polish_poland.852"
    // tylko collate nam potrzebne ale mozna tez LC_ALL
    if (!setlocale(LC_COLLATE, "polish_poland.852")) 
    {
      fprintf(stderr, "Can't set the specified locale! "
              "Check LANG, LC_CTYPE, LC_ALL.\n");
      return 1;
    }

        vector<string> vv;
        string s;
        while ( getline( cin, s ) )
        {
            if (s=="!") break; // koniec wczytywania
            vv.push_back( s );
        }

        sort( vv.begin(), vv.end(), comp );
        
        for ( int i=0; i<vv.size(); i++ )
            cout << vv[i] << endl;
}

Przy okazji jest przykład funkcji sortującej dla std::sort().

Ale jest mały problem z działaniem, TRZEBA dobrze trafić z prawdziwym kodowaniem łańcucha znaków, tzn. jeżeli strona kodowa jest 852 w setlocale() to stringi MUSZĄ być w CP852 :)
Tu może być trudność jeżeli program ma działać na innym kompie (np. z CP1250) ale to pozostawiam dla zioma :]
Na moim win2000 (CP852) program daje kolejność:

a
ą
c
ć
e
ę
l
ł
n
ń
o
ó
s
ś
x
z
ź
ż

Powodzenia!

1 użytkowników online, w tym zalogowanych: 0, gości: 1