| Both sides previous revision
Previous revision
Next revision
|
Previous revision
Next revision
Both sides next revision
|
cpp:stl:iterators [2022/05/26 18:45] gthanos |
cpp:stl:iterators [2023/05/29 17:54] gthanos [Κοινές συναρτήσεις για όλους τους iterators] |
| #include <iostream> | #include <iostream> |
| #include <vector> | #include <vector> |
| | #define SIZE 10 |
| |
| int main () | int main () { |
| { | std::vector<int> myvector (SIZE); // SIZE default-constructed ints |
| std::vector<int> myvector (5); // 5 default-constructed ints | |
| int i=0; | int i=0; |
| | |
| std::vector<int>::reverse_iterator rit = myvector.rbegin(); | for (std::vector<int>::reverse_iterator rit = myvector.rbegin(); rit!= myvector.rend(); ++rit) |
| for (; rit!= myvector.rend(); ++rit) | |
| *rit = ++i; | *rit = ++i; |
| |
| </code> | </code> |
| * **Random Access Iterators:** Πρόκειται για //iterators// που υποστηρίζουν την πράξη της πρόσθεσης και τις αφαίρεσης μεταξύ του //iterator// και ενός ακεραίου αριθμού (η πράξη είναι ανάλογη της αριθμητικής δεικτών). Οι //iterators// αυτής της κατηγορίας υποστηρίζονται από τους //Sequence Containers// //array//, //vector// και //deque// αλλά όχι από τους //containers list// και //forward_list//. Παράδειγμα: | * **Random Access Iterators:** Πρόκειται για //iterators// που υποστηρίζουν την πράξη της πρόσθεσης και τις αφαίρεσης μεταξύ του //iterator// και ενός ακεραίου αριθμού (η πράξη είναι ανάλογη της αριθμητικής δεικτών). Οι //iterators// αυτής της κατηγορίας υποστηρίζονται από τους //Sequence Containers// //array//, //vector// και //deque// αλλά όχι από τους //containers list// και //forward_list//. Παράδειγμα: |
| <code cpp> | <code cpp random_access_iterator.cpp> |
| | #include <iostream> |
| | #include <vector> |
| | #define SIZE 10 |
| | |
| | using namespace std; |
| | |
| | int main() { |
| | vector<int> ints(SIZE); |
| | for(int i=0; i<SIZE; i++) |
| | ints[i] = i+1; |
| | |
| vector<int>::iterator it = ints.cend(); // starting from the end of the container | vector<int>::const_iterator it = ints.cend(); // starting past the end of the container |
| while(true) { | while(it > ints.cbegin()) { |
| it -= 2; // move back by 2 elements | it -= 2; // move back by 2 elements |
| cout << *it1 << " "; | cout << *it << " "; |
| if(it1 <= ints.cbegin()) // stop when we reach or we have passed the first element | if(it <= ints.cbegin()) // stop when we reach or we have passed the first element |
| break; | break; |
| } | } |
| cout << endl; | cout << endl; |
| | } |
| </code> | </code> |
| |
| Εάν θέλουμε να υπολογίσουμε την απόσταση μεταξύ δύο //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); |
| | |
| | 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; |
| | std::cout << "Distance between it2 and it1 is: " << distance(it2, it1) << 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//. Παράδειγμα χρήσης των συναρτήσεων αυτών δίνεται παρακάτω: |