| Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
cpp:functors [2020/05/31 20:34] gthanos |
cpp:functors [2020/06/01 04:25] (current) |
| ===== Η συνάρτηση for_each ===== | ===== Η συνάρτηση for_each ===== |
| |
| Η συνάρτηση [[http://www.cplusplus.com/reference/algorithm/for_each/|std::for_each]] επιτρέπει την μεταβολή του περιεχομένου οποιουδήποτε //container// από μία συνάρτηση. Η υλοποίηση της συνάρτησης δίνεται παρακάτω: | Η συνάρτηση [[http://www.cplusplus.com/reference/algorithm/for_each/|std::for_each]] επιτρέπει την μεταβολή του περιεχομένου ενός //container// από //first// έως //last// (μη συμπεριλαμβανομένου) από τη συνάρτηση //fn//. Η υλοποίηση της συνάρτησης δίνεται παρακάτω: |
| <code cpp> | <code cpp> |
| template<class InputIterator, class Function> | template<class InputIterator, class Function> |
| </code> | </code> |
| |
| Παρακάτω δίνεται ένα παράδειγμα, όπου στα περιεχόμενα ενός ''vector<string>'' προστίθεται το //prefix// "light": | Παρακάτω δίνεται ένα παράδειγμα, όπου στα περιεχόμενα ενός ''vector<string>'' προστίθεται το //prefix// "light" με τη βοήθεια της συνάρτησης //prefixMe//: |
| |
| <code cpp prefix_str.cpp> | <code cpp prefix_str.cpp> |
| } | } |
| </code> | </code> |
| | |
| | ==== Χρήση ενός function object αντί για συνάρτηση ==== |
| |
| Παρατηρήστε ότι ο κώδικας δουλεύει σωστά, με την υποσημείωση ότι κάθε φορά που θέλετε να αλλάξετε το prefix το οποίο προστίθεται στα περιεχόμενα του //container// πρέπει να γράφετε μία νέα συνάρτηση. Αντί για αυτό θα μπορούσαμε να χρησιμοποιήσουμε ένα αντικείμενο ως συνάρτηση το οποίο να έχει τα εξής χαρακτηριστικά: | Παρατηρήστε ότι ο κώδικας δουλεύει σωστά, με την υποσημείωση ότι κάθε φορά που θέλετε να αλλάξετε το prefix το οποίο προστίθεται στα περιεχόμενα του //container// πρέπει να γράφετε μία νέα συνάρτηση. Αντί για αυτό θα μπορούσαμε να χρησιμοποιήσουμε ένα αντικείμενο ως συνάρτηση το οποίο να έχει τα εξής χαρακτηριστικά: |
| - υπερφορτώνει τον τελεστή () (//operator()//) με ένα μόνο όρισμα τύπου //std::string//, ώστε να μπορούμε να το χρησιμοποιήσουμε ως συνάρτηση. | - υπερφορτώνει τον τελεστή () (//operator()//) με ένα μόνο όρισμα τύπου //std::string//, ώστε να μπορούμε να το χρησιμοποιήσουμε ως συνάρτηση. |
| |
| Ένα τέτοιο αντικείμενο ονομάζεται //function object ή functor//. Δείτε το παρακάτω παράδειγμα όπου ορίζουμε την κλάση //PrefixString//, η οποία δημιουργεί ένα //function object//. | Ένα τέτοιο αντικείμενο ονομάζεται //function object ή functor//. Δείτε το παρακάτω παράδειγμα όπου ορίζουμε την κλάση //PrefixString//, η οποία λαμβάνει στον κατασκευαστή της ένα std::string που θα αποτελέσει το //prefix//. Με βάση τον παρακάτω κώδικα, χρησιμοποιώντας αντικείμενα της συγκεκριμένης κλάσης ως συναρτήσεις, μπορούμε να καλέσουμε διαφορετικές εκδόσεις της συνάρτησης που προσθέτει το //prefix//, απλά αλλάζοντας την παράμετρο στον κατασκευαστή της. |
| |
| <code cpp prefix_str_function_object.cpp> | <code cpp prefix_str_function_object.cpp> |