Portál AbcLinuxu, 19. května 2024 00:28


Dotaz: C++ ranges::views a indexy položiek

hermes avatar 18.8.2021 10:48 hermes | skóre: 6 | blog: Elektro | BA
C++ ranges::views a indexy položiek
Přečteno: 303×
Odpovědět | Admin
Ahojte podedil som view_facade a napísal som si objekt na, ktorý sa dajú aplikovať view adaptéry z STL pre C++ 20x ako:
ranges::views::filter
ranges::views::transform
ranges::views::accumulate
...a ďalšie.
Problém je, že tie adaptéry neobsahujú index, iba samotnú položku (napríklad v predikáte funkcie filter nemám aj index položky). a mne by sa ten index občas hodil.

V JS pri operáciách ako map, filter, forEach, reduce vieme zistiť aj index položky, tak že funkcii pridáme ďalší parameter:
[1, 2].map((elem, index) => ({ elem, index })).forEach(console.log); // vypise { elem: 1, index: 0 } a { elem: 2, index: 1 }
niektoré viac strong typed funkcionálne jazyky, kde sa nedá len tak pridávať, alebo vynechať parameter, zase majú špeciálnu variantu funkcií map, iter (mapi, iteri)
[1, 2]
|> Seq.mapi(fun index elem -> $"Index: {index}, Element: {elem}")
|> Seq.iter(printfn "%s")
Pri C++ ranges::views, ak by som chcel mať k dispozícii aj index, by som musel napísať špeciálne adaptéry, podporujúce aj index položky. Ako tento problém riešiť, tak aby som to nemusel takto komplikovať? V zdrojovom objekte tie indexy mám, keďže počas iterovania sa tam updatuje počítadlo, ale ako ten index vložiť do tých funkcií?

Urobiť si wrapper pre objekt, ktorý overloadne operátor "->" a operátor implicitnéj konverzie a tam nejako pridať aj index? Alebo ako to vyriešiť čo najjednoduchšie, aby som mal voliteľne k dispozícii aj index?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Gréta avatar 18.8.2021 11:47 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: C++ ranges::views a indexy položiek
Odpovědět | | Sbalit | Link | Blokovat | Admin

co jakoby takle jednoduše hele to foreach třeba :O :O


std::vector<thisObject> storedValues;
for (size_t idx = 0; auto value : storedValues) {
  std::cout << idx << ": " << value << '\n';
  ++idx;
}

oslavná píseň na pana soudruha generalisima prezidentčíka Petra Pavla Pávka 🎶🫡🦚🎶
hermes avatar 18.8.2021 14:26 hermes | skóre: 6 | blog: Elektro | BA
Rozbalit Rozbalit vše Re: C++ ranges::views a indexy položiek
Ahoj dík za odpoveď, možno som sa nevyjadril zrozumiteľne, skúsim tú otázku večer preformulovať a pridám aj príklady, aby bolo jasnejšie o čo mi ide.
18.8.2021 22:16 Jan Trávníček | skóre: 10 | blog: ehonza | Existuje
Rozbalit Rozbalit vše Re: C++ ranges::views a indexy položiek
Odpovědět | | Sbalit | Link | Blokovat | Admin

Jestli pomocí ranges tak takhle:

#include <vector> #include <string> #include <ranges> #include <algorithm> #include <iostream> int main ( ) { using namespace std::string_literals; std::vector < std::string > data ( { "abc"s, "def"s, "ghi"s } ); for ( const std::pair < int, const std::string & > & elem : data | std::ranges::views::transform ( [ index = 0 ] ( const std::string & elem ) mutable { return std::make_pair ( index ++, std::ref ( elem ) ); } ) ) { std::cout << elem.first << " " << elem.second << std::endl; } return 0; }

 


Jen pozor na vyhodnocování ranges, hodnota může přes transform projít i víckrát v závislosti co následuje...

To mess up a Linux box, you need to work at it; to mess up your Windows box, you just have to work on it.
hermes avatar 19.8.2021 22:27 hermes | skóre: 6 | blog: Elektro | BA
Rozbalit Rozbalit vše Re: C++ ranges::views a indexy položiek
Ahoj, ďakujem, hej s tým aj počítam , robím si jednoduchú minimalistickú objektovú embedded databázu pre ESP32 (resp pre všetky platformy) a namiesto SQL tam budem robiť dotazy cez tieto adaptéry podobne to to rieši aj db4o v .NET cez LINQ... a mám tam aj normálne Idčka, ale jednoduchšie by bolo niektoré operácie riešiť cez indexy a hlavne chcem aby to podporovalo aj objekty ktoré nebudú mať IDčka. Toto je tiež riešenie, napadlo to aj mňa, ale pre užívateľa by som to chcel spraviť nejko deklaratívnejšie. Asi si nakoniec napíšem vlastné adaptéry. Minimálne pre trasform a filter. Ale teraz bojujem s vážnejším problémom. Idem asi na github a pogooglim a pohľadám iné objekty dediace view_facade.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.