User Tools

Site Tools


cpp:functors

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
cpp:functors [2020/05/31 20:32] – created gthanoscpp:functors [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 5: Line 5:
 ===== Η συνάρτηση for_each ===== ===== Η συνάρτηση for_each =====
  
-Η συνάρτηση [[http://www.cplusplus.com/reference/algorithm/for_each/|std::for_each]] επιτρέπει την μεταβολή του περιεχομένου οποιουδήποτε //container// από μία συνάρτηση. Παρακάτω δίνεται ένα παράδειγμα, όπου στα περιεχόμενα ενός ''vector<string>'' προστίθεται το //prefix// "light":+Η συνάρτηση [[http://www.cplusplus.com/reference/algorithm/for_each/|std::for_each]] επιτρέπει την μεταβολή του περιεχομένου ενός //container// από //first// έως //last// (μη συμπεριλαμβανομένου) από τη συνάρτηση //fn//Η υλοποίηση της συνάρτησης δίνεται παρακάτω: 
 +<code cpp> 
 +template<class InputIterator, class Function> 
 +  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> 
 + 
 +Παρακάτω δίνεται ένα παράδειγμα, όπου στα περιεχόμενα ενός ''vector<string>'' προστίθεται το //prefix// "light" με τη βοήθεια της συνάρτησης //prefixMe//:
  
 <code cpp prefix_str.cpp> <code cpp prefix_str.cpp>
 #include <vector> #include <vector>
-#include <list> 
 #include <algorithm> #include <algorithm>
 #include <iostream> #include <iostream>
-#include <iomanip> 
- 
-#include <cstdlib> 
-#include <ctime> 
  
 using namespace std; using namespace std;
Line 42: Line 49:
 } }
 </code> </code>
 +
 +==== Χρήση ενός function object αντί για συνάρτηση ====
  
 Παρατηρήστε ότι ο κώδικας δουλεύει σωστά, με την υποσημείωση ότι κάθε φορά που θέλετε να αλλάξετε το prefix το οποίο προστίθεται στα περιεχόμενα του //container// πρέπει να γράφετε μία νέα συνάρτηση. Αντί για αυτό θα μπορούσαμε να χρησιμοποιήσουμε ένα αντικείμενο ως συνάρτηση το οποίο να έχει τα εξής χαρακτηριστικά: Παρατηρήστε ότι ο κώδικας δουλεύει σωστά, με την υποσημείωση ότι κάθε φορά που θέλετε να αλλάξετε το prefix το οποίο προστίθεται στα περιεχόμενα του //container// πρέπει να γράφετε μία νέα συνάρτηση. Αντί για αυτό θα μπορούσαμε να χρησιμοποιήσουμε ένα αντικείμενο ως συνάρτηση το οποίο να έχει τα εξής χαρακτηριστικά:
Line 47: Line 56:
   - υπερφορτώνει τον τελεστή () (//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>
Line 53: Line 62:
 #include <algorithm> #include <algorithm>
 #include <iostream> #include <iostream>
- 
-#include <cstdlib> 
-#include <ctime> 
  
 using namespace std; using namespace std;
cpp/functors.1590957150.txt.gz · Last modified: 2020/05/31 19:32 (external edit)