S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.
NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

Diskuze: Řadicí funkce pro češtinu

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Hadraba:5.3.2023 20:06

Hledam algoritmus pro řazení s českou diakritikou, abych ho nemusel vymýšlet. Třeba pro použiti v callback funkci sort třidy CTreeCtrl.
Ideálně i s "ch".

Zkusil jsem: Zatím jsem o tom přemýšlel...(-:

Chci docílit: Potřebuji třídit položky ve stromu CTreeCtrl.
Callback funkce dostane, zjednodusene, dva parametry, dva řetězce LPCTSTR
....
The callback function must return a negative value if the first item should precede the second, a positive value if the first item should follow the second, or zero if the two items are equivalent.

 
Odpovědět
5.3.2023 20:06
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Hadraba
DarkCoder:5.3.2023 23:18

Základem všeho je funkce pro třídění české abecedy a nastavení locale. Pak můžeš aplikovat qsort() na celý vektor/pole.

#include <iostream>
#include <locale>
#include <vector>

int compare_czech(const void* a, const void* b) {
        setlocale(LC_COLLATE, "cs_CZ.utf8");
        const std::string& aa = *(const std::string*)a;
        const std::string& bb = *(const std::string*)b;
        const wchar_t* wa = (const wchar_t*)malloc(sizeof(wchar_t) * (aa.size() + 1));
        const wchar_t* wb = (const wchar_t*)malloc(sizeof(wchar_t) * (bb.size() + 1));
        mbstowcs((wchar_t*)wa, aa.c_str(), aa.size() + 1);
        mbstowcs((wchar_t*)wb, bb.c_str(), bb.size() + 1);
        int result = wcscoll(wa, wb);
        free((void*)wa);
        free((void*)wb);
        return result;
}

int main() {
        std::vector<std::string> foods = { "čokoláda", "hříbek", "špagety", "čína", "cibule", "česnek", "šunka", "klobása", "chleba", "koláč" };

        setlocale(LC_ALL, "");

        std::qsort(&foods[0], foods.size(), sizeof(std::string), compare_czech);

        for (const auto& food : foods) {
                std::cout << food << '\n';
        }

        return 0;
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
5.3.2023 23:18
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.