Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
cpp:stl:containers [2020/05/28 17:10] – [Αναζήτηση στοιχείου] gthanos | cpp:stl:containers [2020/05/28 17:49] – [Αναζήτηση στοιχείου] gthanos |
---|
=== Αναζήτηση σε sequence container === | === Αναζήτηση σε sequence container === |
| |
H αναζήτηση σε sequence container γίνεται μέσω της συνάρτησης [[http://www.cplusplus.com/reference/algorithm/find/|std::find]]. Όπως θα δείτε και από τον ενδεικτικό κώδικα στο link η συνάρτηση λειτουργεί διατρέχοντας τον //container// με την βοήθεια ενός //iterator//. Το κόστος αναζήτησης είναι γραμμικό στο πλήθος των στοιχείων του //container// και για αυτό δεν αποτελεί βέλτιστη επιλογή για //associative// και //unordered associative containers//. Δείτε το παρακάτω ενδεικτικό παράδειγμα αναζήτησης σε μία λίστα. Η συνάρτηση [[http://www.cplusplus.com/reference/algorithm/find/|std::find]] επιστρέφει έναν //iterator// που δείχνει στην πρώτη θέση που εμφανίζεται το στοιχείο που αναζητούμε (μπορεί να εμφανίζεται σε περισσότερες θέσεις). Το παρακάτω παράδειγμα είναι ενδεικτικό. | H αναζήτηση σε sequence container γίνεται μέσω της συνάρτησης [[http://www.cplusplus.com/reference/algorithm/find/|std::find]]. Όπως θα δείτε και από τον ενδεικτικό κώδικα στο link η συνάρτηση λειτουργεί διατρέχοντας τον //container// με την βοήθεια ενός //iterator//. Το κόστος αναζήτησης είναι γραμμικό στο πλήθος των στοιχείων του //container// και για αυτό δεν αποτελεί βέλτιστη επιλογή για //associative// και //unordered associative containers//. Δείτε το παρακάτω ενδεικτικό παράδειγμα αναζήτησης σε μία λίστα. Η συνάρτηση [[http://www.cplusplus.com/reference/algorithm/find/|std::find]] επιστρέφει έναν //iterator// που δείχνει στην πρώτη θέση που εμφανίζεται το στοιχείο που αναζητούμε (μπορεί να εμφανίζεται σε περισσότερες θέσεις). Εάν δεν υπάρχει το στοιχείο που αναζητούμε η συνάρτηση //find// επιστρέφει έναν /iterator// που δείχνει στο σημείο του //container// που δείχνει και η συνάρτηση //end//. Το παρακάτω παράδειγμα είναι ενδεικτικό. |
| |
<code cpp find_in_vector.cpp> | <code cpp find_in_vector.cpp> |
| |
=== Αναζήτηση σε unordered set === | === Αναζήτηση σε unordered set === |
| |
| <code cpp find_in_unordered_set.cpp> |
| // unordered_set::find |
| #include <iostream> |
| #include <string> |
| #include <unordered_set> |
| |
| template<typename T> |
| void print_set(std::unordered_set<T>& myset) { |
| std::cout << "myset contains:"; |
| for (auto it=myset.begin(); it!=myset.end(); ++it) |
| std::cout << ' ' << *it; |
| std::cout << '\n'; |
| } |
| |
| int main () { |
| std::unordered_set<std::string> myset; |
| std::unordered_set<std::string>::iterator it; |
| char* word[] = { "sugar", "choco", "milk", "banana", "coffee" }; |
| |
| // unordered_set some initial values: |
| for (int i=0; i<5; i++) |
| myset.emplace(word[i]); |
| |
| print_set(myset); |
| |
| it=myset.find(std::string("biscuits")); |
| if(it != myset.end()) { |
| myset.erase (it); |
| std::cout << "'buiscuits' erased\n"; |
| } |
| else |
| std::cout << "'buiscuits' not found\n"; |
| |
| print_set(myset); |
| myset.erase (myset.find(std::string("milk"))); |
| std::cout << "'milk' erased\n"; |
| print_set(myset); |
| |
| return 0; |
| } |
| </code> |
| |
| <WRAP important 80% center round> |
| Όλες οι παραλλαγές της συνάρτησης find επιστρέφουν έναν //iterator// που δείχνει στην πρώτη (ή στη μοναδική) εμφάνιση του στοιχείου που ψάχνουμε στον //container//. Σε περίπτωση που δεν βρεθεί το στοιχείο ο //iterator// δείχνει μετά το τέλος του //container// εκεί που δείχνει και ο //iterator// που επιστρέφεται από τη συνάρτηση //end//. |
| </WRAP> |
| |