This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | Previous revision | ||
|
cpp:functors [2020/06/01 04:25] |
cpp:functors [2020/06/01 05:25] gthanos [Χρήση ενός function object αντί για συνάρτηση] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Function Objects ή Functors ====== | ||
| + | |||
| + | Συχνά στην STL θέλουμε να εφαρμόσουμε μία συνάρτηση πάνω στο περιεχόμενο ενός // | ||
| + | |||
| + | ===== Η συνάρτηση for_each ===== | ||
| + | |||
| + | Η συνάρτηση [[http:// | ||
| + | <code cpp> | ||
| + | template< | ||
| + | Function for_each(InputIterator first, InputIterator last, Function fn) { | ||
| + | while (first!=last) { | ||
| + | fn (*first); | ||
| + | ++first; | ||
| + | } | ||
| + | return fn; // or, since C++11: return move(fn); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Παρακάτω δίνεται ένα παράδειγμα, | ||
| + | |||
| + | <code cpp prefix_str.cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | using namespace std; | ||
| + | |||
| + | template< | ||
| + | void print(vector< | ||
| + | for(auto it = v.cbegin(); it!=v.cend(); | ||
| + | cout << *it << ", "; | ||
| + | cout << endl; | ||
| + | } | ||
| + | |||
| + | void prefixMe(string& | ||
| + | str = "light " + str; | ||
| + | } | ||
| + | |||
| + | int main() { | ||
| + | vector< | ||
| + | | ||
| + | colors.push_back(" | ||
| + | colors.push_back(" | ||
| + | colors.push_back(" | ||
| + | | ||
| + | print(colors); | ||
| + | for_each(colors.begin(), | ||
| + | print(colors); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Χρήση ενός function object αντί για συνάρτηση ==== | ||
| + | |||
| + | Παρατηρήστε ότι ο κώδικας δουλεύει σωστά, με την υποσημείωση ότι κάθε φορά που θέλετε να αλλάξετε το prefix το οποίο προστίθεται στα περιεχόμενα του // | ||
| + | - διαθέτει ένα πεδίο το οποίο περιέχει το prefix που θα προστεθεί. | ||
| + | - υπερφορτώνει τον τελεστή () (// | ||
| + | |||
| + | Ένα τέτοιο αντικείμενο ονομάζεται //function object ή functor//. Δείτε το παρακάτω παράδειγμα όπου ορίζουμε την κλάση // | ||
| + | |||
| + | <code cpp prefix_str_function_object.cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | using namespace std; | ||
| + | |||
| + | template< | ||
| + | void print(vector< | ||
| + | for(auto it = v.cbegin(); it!=v.cend(); | ||
| + | cout << *it << ", "; | ||
| + | cout << endl; | ||
| + | } | ||
| + | |||
| + | class PrefixString { | ||
| + | string prefix; | ||
| + | public: | ||
| + | PrefixString(string p): prefix(p) {} | ||
| + | void operator()(string& | ||
| + | str = prefix + str; | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | int main() { | ||
| + | vector< | ||
| + | | ||
| + | colors.push_back(" | ||
| + | colors.push_back(" | ||
| + | colors.push_back(" | ||
| + | | ||
| + | print(colors); | ||
| + | for_each(colors.begin(), | ||
| + | print(colors); | ||
| + | } | ||
| + | </ | ||
| + | |||