This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:stl:unordered_set [2020/06/01 05:25] gthanos [Περισσότερα για τις κλάσεις std::unordered_set και std::unordered_multiset] |
cpp:stl:unordered_set [2020/06/01 06:05] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== std:: | ||
| - | Ένα [[http:// | ||
| - | |||
| - | Η κατάταξη ενός νέου στοιχείου γίνεται πάντα μέσω της συνάρτησης κατακερματισμού (//hash function// | ||
| - | |||
| - | | {{ : | ||
| - | | Σχήμα 1. Η δομή της κλάσης [[http:// | ||
| - | |||
| - | ===== Επίδοσης της δομής ===== | ||
| - | |||
| - | * Οι πράξεις της αναζήτησης, | ||
| - | * Η διάτρεξη των στοιχείων γίνεται κατά τη σειρά διάτρεξης του πίνακα κατακερματισμού, | ||
| - | * Σε σχέση με τις κλάσεις [[cpp: | ||
| - | |||
| - | ===== Περισσότερα για τις κλάσεις std:: | ||
| - | |||
| - | H δήλωση της κλάσης // | ||
| - | |||
| - | <code cpp> | ||
| - | template < class Key, // unordered_set:: | ||
| - | class Hash = hash< | ||
| - | class Pred = equal_to< | ||
| - | class Alloc = allocator< | ||
| - | > class unordered_set; | ||
| - | </ | ||
| - | |||
| - | Από την παραπάνω δήλωση της κλάσης παρατηρούμε ότι εκτός από το κλειδί '' | ||
| - | |||
| - | Για τους βασικούς τύπους δεδομένων οι συναρτήσεις αυτές υλοποιούνται μέσω των // | ||
| - | |||
| - | ===== Παράδειγμα 1ο - Αποθήκευση std::string σε unordered_set ή unordered_multiset ===== | ||
| - | |||
| - | <code cpp > | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | template< | ||
| - | void print(std:: | ||
| - | for(auto it = s.cbegin(); it!=s.cend(); | ||
| - | std::cout << *it << " "; | ||
| - | std::cout << std::endl; | ||
| - | } | ||
| - | |||
| - | int main(int argc, char *argv[]) { | ||
| - | std:: | ||
| - | | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | strset.emplace(" | ||
| - | | ||
| - | print(strset); | ||
| - | | ||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <WRAP todo 80% center round> | ||
| - | Αλλάξτε τον //STL container// από // | ||
| - | </ | ||
| - | |||
| - | Παρατηρήστε ότι και στις δύο περιπτώσεις η σειρά διάτρεξης είναι " | ||
| - | |||
| - | ===== Παράδειγμα 2ο - Αποθήκευση Student σε unordered_set ή unordered_multiset ===== | ||
| - | |||
| - | <code cpp student_set.cpp> | ||
| - | #include < | ||
| - | #include < | ||
| - | #include " | ||
| - | |||
| - | template< | ||
| - | void print(std:: | ||
| - | for(auto it = s.cbegin(); it!=s.cend(); | ||
| - | std::cout << *it << " "; | ||
| - | std::cout << std::endl; | ||
| - | } | ||
| - | |||
| - | struct HashByAEM { | ||
| - | size_t operator()(const Student& | ||
| - | std:: | ||
| - | return hash_int(st.getAEM()); | ||
| - | } | ||
| - | }; | ||
| - | |||
| - | struct EqualToByAEM { | ||
| - | bool operator() (const Student& | ||
| - | return st1.getAEM() == st2.getAEM(); | ||
| - | } | ||
| - | }; | ||
| - | |||
| - | int main(int argc, char *argv[]) { | ||
| - | std:: | ||
| - | | ||
| - | students.emplace(" | ||
| - | students.emplace(" | ||
| - | students.emplace(" | ||
| - | students.emplace(" | ||
| - | students.emplace(" | ||
| - | students.emplace(" | ||
| - | students.emplace(" | ||
| - | students.emplace(" | ||
| - | | ||
| - | print(students); | ||
| - | | ||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <WRAP todo 80% center round> | ||
| - | Αλλάξτε τον //STL container// από // | ||
| - | </ | ||