STL algoritmer i member funktioner

Tags:    c++

<< < 12 > >>
Hej udviklere,
en ting der er tilbagevendende i min kode er at bruge iteratorer til at gå gennem en STL container og gøre noget. Et eksempel:
Fold kodeboks ind/udKode 

Jeg kan forstå at det i virkeligheden er den slags man har STL algoritmerne til. Jeg ville gerne lære at bruge en fornuftig syntax med STL algoritmer i stedet for altid at skulle bruge de tunge iteratorer, så det kunne ligne noget a la:
Fold kodeboks ind/udKode 

Hvor jeg prøver at bruge en funktionspointer til en memberfunktion (af RangeSimulation, ikke Species). Problemet er at min compiler (TDM GCC for Windows) ikke vil acceptere denne syntax.
Jeg kunne tænke mig at løse det med et funktionsobjekt:
Fold kodeboks ind/udKode 

Problemet er at functoren nu ikke har adgang til mit RangeSimulation objekt, så det compiler heller ikke. Og hvis jeg lægger functoren ud i namespacet ryger min indkapsling af RangeSimulation klassen også.
Spørgsmålet er, helt generelt: hvordan bruger jeg STL algoritmer med callback (for_each, transform etc.) i memberfunktioner? Der er formentlig en etableret syntaks, jeg blot ikke kender, da dette må være særdeles almindeligt.
På forhånd mange tak!




Indlæg senest redigeret d. 16.03.2010 14:25 af Bruger #8249
18 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Nemlig! Især hvis man skal skrive
typename std::vector<Species *>::const_iterator iter;
for(iter = container.begin()//etc...
OK, jeg troede jeg bare var helt bag af dansen (jeg er selvlært). Jeg holder fast i min loop-kode.
I virkeligheden ønskede jeg mig måske noget a la Python:
newlist = [some_function(elem) for elem in list if some_predicate], idet stort set alt jeg laver arbejder igennem containere på en eller anden måde. Bortset fra at standardlibrary funktionerne er lidt utilgængelige elsker jeg dog C++'s syntaks.



En lidt mere generisk version, hvor du slipper for at lave en ny class for hver kombination af class og funktion

Fold kodeboks ind/udKode 




Tak, Bertel, det er suverænt :)



En endnu bedre version, som ikke har brug for CallMemberFunction class'en:

Fold kodeboks ind/udKode 




Gud fader, virker det? (ja det kan jeg jo se det gør :) )
Det var det jeg var ude efter. Jeg havde godt kigget på mem_fun, men sådan som jeg læste dokumentationen var den adapter udviklet til at bruge en member fun af Species. Kombinationen af bind1st og this vidste jeg ikke kunne fungere på den måde.
Super, tak skal du have!
Michael



Nu bliver det selvfølgelig rent akademisk interesse, men jeg prøvede at udskifte
Fold kodeboks ind/udKode 


ovenfor med
Fold kodeboks ind/udKode 

men så bliver compileren ked af det. Tricket fungerer måske kun for Unary funktioner.



Indlæg senest redigeret d. 23.03.2010 12:53 af Bruger #8249
Jeg tror det kan lade sig gøre, men kan ikke lige få det til at virke.

Det er et af problemerne med de lidt mere avancerede STL ting, syntaxen er for ulogisk og kompliceret og så er det lettere at skrive 5 linier kode en at begynde at sætte sig ind i hvordan det skal gøres med STL.



Helt klart. Jeg bliver ved med at gøre de fleste ting som jeg har gjort hidtil, men med en bedre følelse af at det er en fornuftig måde at gøre det på. Men tricket med bind1st ovenfor kan jeg godt lide, og har implementeret det i min kode :)



<< < 12 > >>
t