Vyhľadávanie položiek v std::map pre Arduino

Vyhľadávanie položiek v std::map pre Arduino
« kdy: 01. 05. 2021, 20:05:41 »
Ahojte používam C++  na vývoj desktopových aplikácií pre linux / windows, no nakoľko som sa C++ začal učiť len minulý a tento rok (nevenoval som sa mu stále, ale s odstupmi niekoľkých mesiacov), prišiel som do kontaktu s jeho najnovšou verziou C++ 20, no teraz som prešiel aj na platformu arduino resp. esp32. Aby bolo jasné, keď píšem o arduine, mám na mysli SW platformu arduino pre ESP32 (nie HW platformu arduino)

ESP32 ma veľmi baví, žiaľ STL pre Arduino je mierne orezané (čo je pochopiteľné keže ESP32 má málo pamate a nemôže si dovoliť ňou mrhať na zbytočné metódy), takže tam chýbajú metódy, na ktoré som zvyknutý z najnovšieho STL pre C++ 20. Momentálne si robím pokusný projekt, ktorý robím len preto, aby som sa tú platformu naučil. Maličká meteostanica, ktorá by mala obsahovať rôzne senzory, bude napríklad merať aktuálnu teplotu a vlhkosť a postupne pridám ďalšie senzory... možno rýchlosť vetra vlhkoasť pôdy na dvore atď... na ESP beží asynchrónny webserver, na ktorý sa pripájam z hociakého zariadenia cez wifi. Mno a ten webserver obsahuje HTML šablóny. HTML šablóny sú uložené v súborovom systéme ESP32ky: SPIFFSFS no a keď urobím request na nejakú adresu, tak chcem aby sa šablóna loadla zo súboru len 1x a aby ostala uložená v RAMke. To znamená že si robím cahce. A na cache som chcel použiť STL kontainer std::map, problém je, že narozdiel od toho Windows / Linux std::map, std::map pre arduino neobsahuje metódu std::map::contains ani metódu [b4]std::map::find[/b]. stl síce obsahuje všeobecnú metódu std::find, kde sa vložia iterátory no obávam sa či je rovnako rýchla ako tá std::map::find. takže otázka je:

1. Aký je najvhodnejší spôsob, ako sa pri std::map (po starom) zistiť či std::map obsahuje položku? bez toho aby som použil exceptiony a metódy std::map::contains a [b4]std::map::find[/b], ktoré na platforme arduino nie sú k dispozícii?

2. je std::find vhodný na zisťovanie existencie položky pre kontainer std::map? neni std::find pomalší a nevyhľadáva položky, tak ako keby išlo o pole párov (std::pair)? Lebo vyhľadávanie v poli je niekoľkonásobne pomalšie, ako keď mám položky indexované cez kľúče nie?
« Poslední změna: 01. 05. 2021, 20:10:53 od fortran1986 »


RDa

  • *****
  • 2 465
    • Zobrazit profil
    • E-mail
Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #1 kdy: 01. 05. 2021, 22:57:49 »
Si udelej odvozenou tridu/sablonu a implementuj si to, co ti chybi.

alex6bbc

  • *****
  • 1 431
    • Zobrazit profil
    • E-mail
Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #2 kdy: 02. 05. 2021, 09:36:55 »
a nebo si sam naimplementuj red-black tree, ktery pouziva mapa.

https://en.wikipedia.org/wiki/Red%E2%80%93black_tree

Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #3 kdy: 02. 05. 2021, 21:11:48 »
A nebo si naimplementujte nějakou datovou strukturu přímo na míru. Není to tak těžké, navíc zřejmě ušetříte nějakou tu paměť. Pro vaše účely může stačit třeba i jednoduché pole či malá hashovací tabulka.

anonacct

Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #4 kdy: 02. 05. 2021, 22:02:21 »
Nechce se mi věřit, že by tam byla mapa, která ale nemá find... Moc nevím, k čemu by takové mapa byla. Díval ses do toho headeru? Je dost možné, že ten find jen voláš s něčím s čím nemáš, popř. definuješ tu mapu jako std::map<K, V, std::less<>>?

Na netu je milion datových struktur pro C++ - takže pokud tam je fakt nějaké zkriplené stl, tak bych si nějakou mapu buď udělal a nebo použil něco co už někdo jiný udělal. Nějaká flat mapa by byla asi ok.


alex6bbc

  • *****
  • 1 431
    • Zobrazit profil
    • E-mail
Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #5 kdy: 03. 05. 2021, 06:42:46 »
a nebo se s tim pracuje tak, ze jen zadas hledany klic: auto hodnota = mapa[klic] a kdyz neni tak to vyhodi excepsnu.

Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #6 kdy: 03. 05. 2021, 07:46:25 »
a nebo se s tim pracuje tak, ze jen zadas hledany klic: auto hodnota = mapa[klic] a kdyz neni tak to vyhodi excepsnu.
C++ map takhle nefunguje. operátor[] nehází a vždycky vrátí referenci. Pokud klíč v mapě není, tak ho tam přidá a přiřadí mu defaultní hodnotu.

Moc se mi ale nezdá, že by stl map na arduinu neuměla find. To bych spíš čekal, že tam ta mapa bude chybět úplně.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #7 kdy: 03. 05. 2021, 08:46:27 »
a nebo se s tim pracuje tak, ze jen zadas hledany klic: auto hodnota = mapa[klic] a kdyz neni tak to vyhodi excepsnu.
Na Arduinu jsou výjimky vypnuté. A tenhle kód stejně žádnou nehází.

Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #8 kdy: 03. 05. 2021, 11:11:49 »
a nebo se s tim pracuje tak, ze jen zadas hledany klic: auto hodnota = mapa[klic] a kdyz neni tak to vyhodi excepsnu.
Na Arduinu jsou výjimky vypnuté. A tenhle kód stejně žádnou nehází.
Může tam něco hodit operátor porovnání klíčů, nebo defaultní konstruktor pokud hodnota není v mapě. Ale mapa sama o sobě nic házet nebude. Ono celé STL toho samo o sobě hází velice málo.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #9 kdy: 03. 05. 2021, 11:16:07 »
a nebo se s tim pracuje tak, ze jen zadas hledany klic: auto hodnota = mapa[klic] a kdyz neni tak to vyhodi excepsnu.
Na Arduinu jsou výjimky vypnuté. A tenhle kód stejně žádnou nehází.
Může tam něco hodit operátor porovnání klíčů, nebo defaultní konstruktor pokud hodnota není v mapě. Ale mapa sama o sobě nic házet nebude. Ono celé STL toho samo o sobě hází velice málo.
Jasně, záleží na datech. Nicméně na Arduinu se s výjimkami moc nepočítá. Dost ale pochybuji, že tam není find.

Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #10 kdy: 03. 05. 2021, 11:21:25 »
Jasně, záleží na datech. Nicméně na Arduinu se s výjimkami moc nepočítá. Dost ale pochybuji, že tam není find.
Teď mě napadlo, že možná postrádá C++14 find který bere cokoliv porovnatelného s klíčem. Starý find bere jen klíč. Možná je tohle tazatelův problém.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #11 kdy: 03. 05. 2021, 13:21:18 »
Jasně, záleží na datech. Nicméně na Arduinu se s výjimkami moc nepočítá. Dost ale pochybuji, že tam není find.
Teď mě napadlo, že možná postrádá C++14 find který bere cokoliv porovnatelného s klíčem. Starý find bere jen klíč. Možná je tohle tazatelův problém.
Snad to tazatel upřesní.

alex6bbc

  • *****
  • 1 431
    • Zobrazit profil
    • E-mail
Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #12 kdy: 03. 05. 2021, 14:29:35 »
metoda at(klic) ta vyhazuje excepsnu, pri nenalezenem klici.

Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #13 kdy: 05. 05. 2021, 01:10:21 »
Ahojte, ďakujem za snahu o pomoc, find to neobsahuje. Pozeral som to v hlavičkovom súbore aj cez autocomplete. Pozeral som všetky metódy mapu. map::at tam je, ale neviem akým spôsobom mám testovať, či tam ten kľúč vôbec je. Exceptiony som na audrine / ESP32 nepoužíval, niekto spomínal, že na Arduine ani nie sú. Aj keď je možné že ESP by ich mohol mať.

Porovnával som to s klasickým std::map z iných platforiem a tam ten find je.

Takže buď som niečo nepochopil, alebo je to nejaká nedokončená implementácia STL (adresár xtensa-esp32-elf-gcc). Skúsim nájsť nejaký alternatívny map, alebo iné STL a zajtra vyskúšam či esp32 podporuje exceptiony, predsa len ESP32 je trošku iná platforma.Ak by na ESP predsa len boli možno ývojári sa spoliehajú na to, že sa použije at tak ako ste spomínali vyššie.
« Poslední změna: 05. 05. 2021, 01:11:57 od fortran1986 »

Re:Vyhľadávanie položiek v std::map pre Arduino
« Odpověď #14 kdy: 05. 05. 2021, 01:48:30 »
Metoda
Kód: [Vybrat]
std::map::count(const key_type& k) tam taky není?