STL Algorithmen in Verbindung mit Klassenmethoden benutzen
-
Hallo!
Bevor ich wieder einen Tag vor der Übungsabgabe zum Fragen anfange, wollte ich diesmal etwas früher damit anfange:
Wie definiere ich die Prädikate für die STL-Algorithmen (copy, foreach, transform,..amo) bei Benutzung von Klassenmethoden (z.b die getmethode irgendeiner klasse) statt den üblichen Datentypen (int,...) um das "hässliche" Arbeiten aus der Kombination einer for Schleife und eines jeweligen Iterators zu vermeiden? oder geht das überhaupt gar nicht( hab in unseren Unterlagen nichts darüber gefunden), falls es doch geht, gibt es dann auch einen Unterschied bei der Implementierung mit dynmischen bzw. satischen Objekten?
-
das "hässliche" Arbeiten aus der Kombination einer for Schleife und eines jeweligen Iterators
Wieso ist das hässlich? Mit range-based for würde ich sogar zu einer Schleife tendieren. Statt bspw.
transformalsofor( auto& e : Range ) func(e);Wie definiere ich die Prädikate für die STL-Algorithmen
Meinst du Funktoren? Indem du eine Klasse schreibst und für diese den
operator()überlädst.
-
hässlich" deswegen, weil wir das mehrmals brauchen und somit in mienen augen nur code.duplizierung entsteht

die methode mit dem range kenn ich nicht. ich schätze mal, dass das mit dem auto in c++11 funktioniert oder? (dürfen wir noch nicht verwenden). könntest du diese methode vllt nöher erläutern?
stimmt funktoren gibts ja auch noch xD und auch hier kenne ich es mit der benutzung von klassenmethoden in einem funktor nicht
ich schätze mal ich gebe bei benutzung eines funktors eine referenz der jweiligen klasse mit (referenz der klasse deswegen, um irgendeine methode aufzurufen)void operator()(classfoo& foo){foo.whatevermethod;}schließlich wenn ich in derselben klasse andere methoden habe, die eben einen funktor nutzen wollen (allerdings jetzt andere klassenmethoden), kann ich ja nicht wieder z.b das obegenannte bsp. benutzen (weil ich ja ig. wieder nur eine referenz mitgebe). wenn ich hier irgendwelche flags setze, wäre das auch wieder richtig unschön
void operator()(classfoo& foo, enum TFlag){... case blabla tu foo.whatevermethod2()...ansonsten tu das...;}
-
Dass tolle ist ja, dass Funktoren statr speichern können.
Im Konstruktor holst du dir die Referenz zu der Klassse und die Flags, die apeicherst du ab und der operator() nimmt lediglich die Referenz auf das Element.
-
Ich habe dem Ausdruck Lambda noch nicht gelesen hier... Ist seit lambdas (praktisch eine in-place Definition von Funktoren) nicht alles schön geworden?
-
also:
std::for_each( a.begin(), a.end(), []( MeinTyp& ref ) { ref.Some() } ); std::transform( a.begin(), a.end(), []( MeinTyp& ref ) { return MeinTyp(ref)+X; } );
-
decimad schrieb:
Ich habe dem Ausdruck Lambda noch nicht gelesen hier... Ist seit lambdas (praktisch eine in-place Definition von Funktoren) nicht alles schön geworden?
Es wurde "kein C++11" gesagt. Also hat sich das leider erledigt.
-
Herrje, da muss ich wohl mal genauer lesen!
Ist es nicht ziemlich dämlich in der Ausbildung den aktuellen Stand explizit auszuschließen?
-
Marthog schrieb:
decimad schrieb:
Ich habe dem Ausdruck Lambda noch nicht gelesen hier... Ist seit lambdas (praktisch eine in-place Definition von Funktoren) nicht alles schön geworden?
Es wurde "kein C++11" gesagt. Also hat sich das leider erledigt.
sitmmt ned so ganz
alle features was im vc10 dabei sind, dürfen wir verwwenden.
gehört haben wir letztes jahr schon was davon, alelrdings eben als c++11 funktion.
laut dieser seite: http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
ist die lambdafunktion auch in vc10 enthalten. auch die neue bedeutung des "auto" keywords ist anscheinend dabei (haben wir aber nicht gelernt). for range loop ist allerdings nicht enthalten
lambda funktionen dürfte ich also theoretisch verwenden (sehe ich erst, wenn ich einen pounkteabzug dafür bekomme :))@decimad: wieso wir c++11 nicht direkt in verbindung mit vs 2013,gcc,... verwenden dürfen ist:
der tutor müsste beide versionen installiert haben.
es sind nicht allzuviele erneurungen dabei, sodass ein umstieg auf allen rechnern (wobei weiters gesagt wurde, dass vs2012 nicht benutzerfreundlich genug ist) sich auszahlen würde
-
Reicht es nicht, wenn er den "größten" installiert hat? Es ist zwar möglich andererseits auch wieder ziemlich unwahrscheinlich, dass etwas, das im alten durchkompiliert, im neuen Probleme verursacht. Aber wie dem auch sei, ist doch schön, dass Du Lambdas verwenden kannst, die verschönern nämlich die Lösung genau der genannten Probleme ungemein!
-
In C++98 gibt es mem_fun und mem_fun_ref, wär das nicht was? (Die sind in C++11 deprecated.)