NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
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
+1
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.