cpp:stl:set

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
cpp:stl:set [2020/05/30 19:40]
gthanos [Παράδειγμα ένθεσης και διάτρεξης ενός set]
cpp:stl:set [2020/05/31 06:25]
gthanos [std::set και std::multiset]
Line 9: Line 9:
 </code>  </code> 
  
-Ένα [[http://www.cplusplus.com/reference/set/multiset/|std::multiset]] αποτελεί ένα σύνολο όχι απαραίτητα μοναδικών στοιχείων, τα οποία είναι αποθηκευμένα σε ένα ισοζυγισμένο δέντρο αναζητήσεως. Ο τρόπος σύγκρισης και η κατάταξη των στοιχείων είναι παρόμοια με την επίπλέον σημείωση ότι το δέντρο επιτρέπει την εμφάνιση ενός κλειδιού περισσότερες από μία φορές. +Ένα [[http://www.cplusplus.com/reference/set/multiset/|std::multiset]] αποτελεί ένα σύνολο όχι απαραίτητα μοναδικών στοιχείων (μπορεί να είναι, μπορεί και να μην είναι μοναδικά), τα οποία είναι αποθηκευμένα σε ένα ισοζυγισμένο δέντρο αναζητήσεως (όπως το //set//). Ο τρόπος σύγκρισης και η κατάταξη των στοιχείων είναι όμοια με την επίπλέον σημείωση ότι το δέντρο επιτρέπει την εμφάνιση ενός κλειδιού περισσότερες από μία φορές. 
  
-Στα παρακάτω σχήματα διακρίνεται η δομή ενός [[http://www.cplusplus.com/reference/set/set/|std::set]] και ενός [[http://www.cplusplus.com/reference/set/multiset/|std::multiset]].+Στα παρακάτω σχήματα διακρίνεται η δομή ενός [[http://www.cplusplus.com/reference/set/set/|std::set]] και ενός [[http://www.cplusplus.com/reference/set/multiset/|std::multiset]], όπου τα στοιχεία είναι ακέραιοι.
  
 | {{ :cpp:stl:set01.png? |}}| {{ :cpp:stl:multiset01.png? |}} | | {{ :cpp:stl:set01.png? |}}| {{ :cpp:stl:multiset01.png? |}} |
Line 96: Line 96:
 } }
 </code> </code>
 +
 +<WRAP todo 80% center round>
 +Αλλάξτε τον //STL container// από //std::set// σε //std::multiset// και παρατηρήστε την συμπεριφορά του προγράμματος σε αυτή την περίπτωση.
 +</WRAP>
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
Line 101: Line 105:
 </WRAP> </WRAP>
  
-<WRAP todo 80% center round> +===== Οι συναρτήσεις lower_bound, upper_bound και equal_range ===== 
-Αλλάξτε τον //STL container// από //std::set// σε //std::multiset// και παρατηρήστε την συμπεριφορά του προγράμματος σε αυτή την περίπτωση. + 
-</WRAP>+Οι κλάσεις //std::set// και //std::multiset// διαθέτουν τις συναρτήσεις [[http://www.cplusplus.com/reference/set/set/lower_bound/|lower_bound]], [[http://www.cplusplus.com/reference/set/set/upper_bound/|upper_bound]] και [[http://www.cplusplus.com/reference/set/set/equal_range/|equal_range]] οι οποίες λειτουργούν ως εξής: 
 + 
 +  * **iterator lower_bound (const value_type& val) const:** Επιστρέφει έναν //iterator// που δείχνει στη θέση ενός στοιχείου που είναι ίσο ή μεγαλύτερο από την τιμή //**val**//
 +  * **iterator upper_bound (const value_type& val) const:** Επιστρέφει έναν //iterator// που δείχνει στην θέση ενός στοιχείου που είναι μεγαλύτερο από την τιμή //**val**//.  
 +  * **pair<iterator,iterator> equal_range (const value_type& val):** Επιστρέφει έναν ζεύγος //iterator// (δες περισσότερα σχετικά με την κλάση //pair// στην ενότητα [[cpp:stl:map|std::map και std::multimap]]) που δείχνει στην αρχή και στο τέλος ενός εύρους στοιχείων στον //container//, όπου τα κλειδιά είναι ίδια με την τιμή //**val**//. Για ένα //set// το εύρος αυτό έχει μέγιστο μέγεθος ένα στοιχείο, ενώ για ένα //multiset// μπορεί να περιέχει περισσότερα στοιχεία. Εάν δεν βρεθεί κανένα στοιχείο με τιμή //**val**// οι //iterators// του ζεύγους δείχνουν και οι δύο σε κοινή θέση. 
 + 
 +=== Παράδειγμα upper_bound, lower_bound, equal_range === 
 + 
 +<code cpp string_multiset.cpp> 
 +#include <set> 
 +#include <string> 
 +#include <iostream> 
 + 
 +template<typename T> 
 +void print(std::multiset<T> s) { 
 +  for(auto it = s.cbegin(); it!=s.cend(); it++)  
 +    std::cout << *it << " "; 
 +  std::cout << std::endl; 
 +
 + 
 +int main(int argc, char *argv[]) { 
 +  std::multiset<std::string> strset; 
 +   
 +  strset.emplace("orange"); 
 +  strset.emplace("apple"); 
 +  strset.emplace("mango"); 
 +  strset.emplace("cherry"); 
 +  strset.emplace("melon"); 
 +  strset.emplace("apricot"); 
 +  strset.emplace("pineapple"); 
 +  strset.emplace("mango"); 
 +  strset.emplace("apricot"); 
 +  strset.emplace("apple"); 
 +  strset.emplace("apple"); 
 +   
 +  print(strset); 
 +   
 +  auto lower_it = strset.lower_bound("apricot"); 
 +  auto upper_it = strset.upper_bound("kiwi"); 
 +    
 +  strset.erase(lower_it, upper_it); 
 +  print(strset); 
 +   
 +  auto range = strset.equal_range("mango"); 
 +  strset.erase(range.first,range.second); 
 +  print(strset); 
 +   
 +  //Searching for mango again... 
 +  range = strset.equal_range("mango"); 
 +  if(range.first == range.second) 
 +    std::cout << "range.first == range.second\n"; 
 +     
 +  return 0; 
 +} 
 +</code>
  
  
  
cpp/stl/set.txt · Last modified: 2023/05/30 11:04 by gthanos