| Both sides previous revisionPrevious revisionNext revision | Previous revision | 
| cpp:stl:iterators [2022/05/26 18:54]  – [STL Iterators]  gthanos | cpp:stl:iterators [2023/05/30 18:48] (current)  –  gthanos | 
|---|
|  |  | 
| * **Input Iterator:** Πρόκειται για έναν //iterator// από τον οποίο μπορούμε μόνο να διαβάσουμε το τρέχον στοιχείο της δομής στο οποίο δείχνει. Πρόκειται για έναν //iterator// ανάγνωσης του περιεχόμενου της δομής. Όλοι οι διαθέσιμοι //iterators// είναι //Input Iterators//. Παράδειγμα: | * **Input Iterator:** Πρόκειται για έναν //iterator// από τον οποίο μπορούμε μόνο να διαβάσουμε το τρέχον στοιχείο της δομής στο οποίο δείχνει. Πρόκειται για έναν //iterator// ανάγνωσης του περιεχόμενου της δομής. Όλοι οι διαθέσιμοι //iterators// είναι //Input Iterators//. Παράδειγμα: | 
| <code cpp> |  | 
|  | <code cpp input_iterator.cpp> | 
|  | #include <vector> | 
|  | #include <iostream> | 
|  | #define SIZE 10 | 
|  | using namespace std; | 
|  |  | 
|  | int main() { | 
|  | vector<int> ints; | 
|  | for(int i=0; i<10; i++) | 
|  | ints.push_back(SIZE-i); | 
|  |  | 
| for(vector<int>::const_iterator it=ints.cbegin(); it!=ints.cend(); it++) | for(vector<int>::const_iterator it=ints.cbegin(); it!=ints.cend(); it++) | 
| cout << *it << " "; | cout << *it << " "; | 
| cout << endl; | cout << endl; | 
|  | } | 
| </code> | </code> | 
| * **Output Iterator:** Πρόκειται για έναν //iterator// μέσω του οποίου μπορούμε να διαβάσουμε και να γράψουμε στο τρέχον στοιχείο του //container//. Οι //iterators// που στον τύπο τους περιέχουν το συνθετικό //const_// (const_iterator, const_reverse_iterator) δεν ανήκουν στη συγκεκριμένη κατηγορία. Παραδείγματα: | * **Output Iterator:** Πρόκειται για έναν //iterator// μέσω του οποίου μπορούμε να διαβάσουμε και να γράψουμε στο τρέχον στοιχείο του //container//. Οι //iterators// που στον τύπο τους περιέχουν το συνθετικό //const_// (const_iterator, const_reverse_iterator) δεν ανήκουν στη συγκεκριμένη κατηγορία. Παραδείγματα: | 
| <code cpp> | <code cpp output_iterator.cpp> | 
|  | #include <vector> | 
|  | #include <iostream> | 
|  | #define SIZE 10 | 
|  | using namespace std; | 
|  |  | 
|  | int main() { | 
|  | vector<int> ints; | 
|  | for(int i=0; i<10; i++) | 
|  | ints.push_back(SIZE-i); | 
|  |  | 
| for(vector<int>::iterator it=ints.begin(); it!=ints.end(); it++) { | for(vector<int>::iterator it=ints.begin(); it!=ints.end(); it++) { | 
| *it += 10;                         // we modify container here | *it += 10;                         // we modify container here | 
| cout << *it << " "; | cout << *it << " "; | 
| } | } | 
|  | cout << endl; | 
|  |  | 
| for(vector<int>::const_iterator it=ints.cbegin(); it!=ints.cend(); it++) { | for(vector<int>::const_iterator it=ints.cbegin(); it!=ints.cend(); it++) { | 
| cout << *it << " "; | cout << *it << " "; | 
| } | } | 
|  | } | 
| </code> | </code> | 
| * **Bidirectional Iterator:** Πρόκειται για iterators που εκτός των πράξεων ''++it'', ''it++'' υποστηρίζουν και τις πράξεις ''%%--%%it'', ''it%%--%%''. //Bidirectional Iterators// είναι όλοι οι //iterators// με εξαίρεση εκείνούς που ανήκουν σε //Unordered Associative Containers// και οι //iterators// του //container forward_list// (απλά συνδεδεμένη λίστα). Παραδείγματα: | * **Bidirectional Iterator:** Πρόκειται για iterators που εκτός των πράξεων ''++it'', ''it++'' υποστηρίζουν και τις πράξεις ''%%--%%it'', ''it%%--%%''. //Bidirectional Iterators// είναι όλοι οι //iterators// με εξαίρεση εκείνούς που ανήκουν σε //Unordered Associative Containers// και οι //iterators// του //container forward_list// (απλά συνδεδεμένη λίστα). Παραδείγματα: | 
| Εάν θέλουμε να υπολογίσουμε την απόσταση μεταξύ δύο //iterators// παρέχεται η συνάρτηση [[http://www.cplusplus.com/reference/iterator/distance/|distance]] η οποία υπολογίζει την απόσταση από το πρώτο όρισμα (//first//) έως το δεύτερο όρισμα (//last//) μετακινώντας τον δείκτη από //first// έως //last// με χρήση του τελεστή ''++''. Η συνάρτηση υποθέτει ότι το //first// βρίσκεται πριν από το //last//. | Εάν θέλουμε να υπολογίσουμε την απόσταση μεταξύ δύο //iterators// παρέχεται η συνάρτηση [[http://www.cplusplus.com/reference/iterator/distance/|distance]] η οποία υπολογίζει την απόσταση από το πρώτο όρισμα (//first//) έως το δεύτερο όρισμα (//last//) μετακινώντας τον δείκτη από //first// έως //last// με χρήση του τελεστή ''++''. Η συνάρτηση υποθέτει ότι το //first// βρίσκεται πριν από το //last//. | 
|  |  | 
| ===== Κοινές συναρτήσεις για όλους τους containers για την επιστροφή των θέσεων αρχής και τέλους ===== | Δείτε το παρακάτω παράδειγμα χρήσης των συγκεκριμένων συναρτήσεων | 
|  |  | 
|  | <code cpp advance_distance.cpp> | 
|  | #include <iostream>     // std::cout | 
|  | #include <iterator>     // std::advance | 
|  | #include <list>         // std::list | 
|  |  | 
|  | int main () { | 
|  | std::list<int> mylist; | 
|  | for (int i=0; i<10; i++) mylist.push_back (i*10); | 
|  |  | 
|  | for(std::list<int>::const_iterator it = mylist.cbegin(); it!=mylist.cend(); ++it) | 
|  | std::cout << *it << " "; | 
|  | std::cout << std::endl; | 
|  |  | 
|  | std::list<int>::iterator it = mylist.begin(); | 
|  |  | 
|  | std::advance (it,5); | 
|  |  | 
|  | std::cout << "The sixth element in mylist is: " << *it << '\n'; | 
|  |  | 
|  | std::list<int>::iterator it1 = mylist.begin(); | 
|  | std::advance(it1,2); | 
|  |  | 
|  | std::list<int>::iterator it2 = mylist.end(); | 
|  | std::advance(it2,-2); | 
|  |  | 
|  | std::cout << "Distance between it1 and it2 is: " << distance(it1, it2) << std::endl; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | </code> | 
|  |  | 
|  | ==== Κοινές συναρτήσεις για όλους τους containers για την επιστροφή των θέσεων αρχής και τέλους ==== | 
|  |  | 
| H //STL// παρέχει τις //templated// συναρτήσεις [[http://www.cplusplus.com/reference/iterator/begin/|begin]] και [[http://www.cplusplus.com/reference/iterator/end|end]] για την εύρεση της αρχικής και της τελικής θέσης οποιουδήποτε //container//. Οι συναρτήσεις αυτές είναι διαφορετικές από τις συναρτήσεις μέλη //begin// και //end// που περιέχει κάθε //container//. Παράδειγμα χρήσης των συναρτήσεων αυτών δίνεται παρακάτω: | H //STL// παρέχει τις //templated// συναρτήσεις [[http://www.cplusplus.com/reference/iterator/begin/|begin]] και [[http://www.cplusplus.com/reference/iterator/end|end]] για την εύρεση της αρχικής και της τελικής θέσης οποιουδήποτε //container//. Οι συναρτήσεις αυτές είναι διαφορετικές από τις συναρτήσεις μέλη //begin// και //end// που περιέχει κάθε //container//. Παράδειγμα χρήσης των συναρτήσεων αυτών δίνεται παρακάτω: |