Portál AbcLinuxu, 23. říjen 2017 06:46

Dotaz: std::remove_if mutace v predicate

2.6. 19:29 Petr
std::remove_if mutace v predicate
Přečteno: 208×
Odpovědět | Admin
Na cppreference čtu, že nemůžu modifikovat objekty v "predicate" funkci, kterou předám std::remove_if. Proč tomu tak je? Potřeboval bych odstranit určité prvky z vektoru, které splňují danou podmínku, ale zároveň při jejich odstranění z vektoru potřebuji udělat jejich mutaci. Bohužel projít prvky až po remove_if je pozdě, protože provádí move, nikoliv swap. Musím si opravdu napsat kvůli tomu vlastní algoritmus, který bude kopií toho standardního, jenom nebude mít "zakázánu" mutaci?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

2.6. 23:18 johniez | skóre: 17 | blog: xyz | Praha
Rozbalit Rozbalit vše Re: std::remove_if mutace v predicate
Odpovědět | | Sbalit | Link | Blokovat | Admin
http://www.drdobbs.com/effective-standard-c-library-unary-predi/184403777
3.6. 03:25 .
Rozbalit Rozbalit vše Re: std::remove_if mutace v predicate
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud potřebuješ mutovat rušený element, tak něco děláš špatně.
3.6. 14:59 Petr
Rozbalit Rozbalit vše Re: std::remove_if mutace v predicate
V tom vectoru jsou pointery, vector objekty nevlastni. Jsou to vyfiltrovane polozky. Na zaklade kriteria z nich potrebuju odstranit ty ktere ho splnuji, zaroven polozkam chci odnastavit priznak, ze jsou zobrazeny. Prece kvuli tomu zmenemusim vector prochazet 2x...
3.6. 15:56 doon
Rozbalit Rozbalit vše Re: std::remove_if mutace v predicate

Napadají mě 2 řešení:

1) Místo pointerů si udělej wrapper třídu na pointer, která v destruktoru nastaví ten příznak a pak udělej erase(remove_if)

2) Příznaku přidej klíčové slovo mutable a potom můžeš volat metodu, která upraví příznak a je zároveň const

3.6. 19:53 .
Rozbalit Rozbalit vše Re: std::remove_if mutace v predicate
Pak tedy měníš odkazovaný objekt a ne ten ukazatel -- element vektoru.
3.6. 19:56 Petr
Rozbalit Rozbalit vše Re: std::remove_if mutace v predicate
Takhle jsem o tom neuvažoval. Děkuji, prostě tedy budu mutovat odkazovaný objekt.
3.6. 03:58 doon
Rozbalit Rozbalit vše Re: std::remove_if mutace v predicate
Odpovědět | | Sbalit | Link | Blokovat | Admin
tak udělej klasický erase(remove_if) a akci, kterou potřebuješ udělat při odstranění hoď do destruktoru?

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.