1 ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D. Χειµώνας 2006 ιάλεξη 10η
2 Ιστοσελίδα του µαθήµατος http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fa ll06.htm Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος Επικοινωνία: dimitris@skyblue.csd.auth.gr etousido@uth.gr
3 Περιεχόµενα Templates Standard Template Library (STL)
4 Στόχοι εκµάθησης Templates συναρτήσεων Σύνταξη, ορισµός Ασυµβατότητες του compiler Templates κλάσεων Σύνταξη Παράδειγµα: template κλάση για πίνακα Templates και κληρονοµικότητα Παράδειγµα: template κλάση για µερικώς πληρωµένο πίνακα
5 Εισαγωγικά Templates στη C++ Επιτρέπουν πολύ γενικούς ορισµούς για συναρτήσεις και κλάσεις Τα ονόµατα των τύπων είναι παράµετροι αντί να δηλώνονται οι πραγµατικοί τύποι Ο ακριβής ορισµός των τύπων προσδιορίζεται κατά την εκτέλεση του κώδικα
6 Templates συναρτήσεων Έστω µια συνάρτηση για αντιµετάθεση τιµών, η συνάρτηση swapvalues: void swapvalues(int& var1, int& var2) { int temp; temp = var1; var1 = var2; var2 = temp; } Εφαρµόζεται µόνο για µεταβλητές τύπου int Φυσικά ο κώδικας είναι ΟΚ για οποιοδήποτε τύπο δεδοµένων!
Templates συναρτήσεων & υπερφόρτωση 7 Θα µπορούσαµενακάνουµε overload τη συνάρτηση ώστε να δέχεται ορίσµατα char: void swapvalues(char& var1, char& var2) { char temp; temp = var1; var1 = var2; var2 = temp; } Αλλά παρατηρήστε: οκώδικαςείναισχεδόν πανοµοιότυπος! Η µόνη διαφορά είναι ο τύπος δεδοµένων που χρησιµοποιείται σε 3 σηµεία
8 Σύνταξη Template συναρτήσεων Επιτρέπει την αντιµετάθεση τιµών ( swap values ) δυο µεταβλητών οποιουδήποτε τύπου δεδοµένων: template<class T> void swapvalues(t& var1, T& var2) { T temp; temp = var1; var1 = var2; var2 = temp; } Ηπρώτηγραµµή λέγεται "template prefix" Λεει στον compiler ότι αυτό που ακολουθεί είναι µια "template" Και ότι το T είναι µια παράµερος τύπου δεδοµένων
9 Template Prefix (1/2) Θυµηθείτε: template<class T> Σ αυτή τη χρήση, το "class" σηµαίνει "type", ή "classification" Μπορεί να γίνει σύγχυση µε άλλες γνωστές χρήσεις της λέξης "class"! Η C++ επιτρέπει λέξη-κλειδί "typename" στη θέση της λέξη-κλειδί class εδώ Αλλά συνήθως χρησιµοποιούµετηλέξη"class"
10 Template Prefix (2/2) Ξανά: template<class T> Το Tµπορεί να αντικατασταθεί µε οποιοδήποτε τύπο Προκαθορισµένο ή ορισµένο από το χρήστη (όπως µια κλάση) Στο σώµα της συνάρτησης: Το T χρησιµοποιείται όπως οποιοσδήποτε άλλος τύπος Σηµειώστε: µπορούµεναχρησιµοποιήσουµε οποιοδήποτε άλλο σύµβολο εκτός από το "T", αλλά το T χρησιµοποιείται παραδοσιακά
11 Ορισµός Template συνάρτησης Η template συνάρτησης swapvalues() είναι στην πραγµατικότητα µια συλλογή ορισµών! Ένας ορισµός για κάθε πιθανό τύπο! Ο compiler παράγει ορισµούς µόνο όταν απαιτείται Αλλά είναι σαν να είχαµε δηµιουργήσει όλους αυτούς τους ορισµούς Γράφουµεένανορισµό δουλεύει για όλους τους τύπους που µπορεί να φτιάξουµε
12 Κλήση µιας template συνάρτησης Θεωρήστε την επόµενη κλήση: swapvalues(int1, int2); Ο C++ compiler παράγει τον ορισµό της συνάρτησης για δυο int παραµέτρους χρησιµοποιώντας την template Το ίδιο για όλους τους άλλους τύπους εν χρειάζεται να κάνει κάτι ιδιαίτερο για την κλήση Οαπαιτούµενος ορισµός παράγεται αυτόµατα
13 Μια άλλη template συνάρτησης ήλωση/πρωτότυπο: Template<class T> void showstuff(int stuff1, T stuff2, T stuff3); Ορισµός: template<class T> void showstuff(int stuff1, T stuff2, T stuff3) { cout << stuff1 << endl << stuff2 << endl << stuff3 << endl; }
14 Κλήση showstuff Θεωρήστε την κλήση: showstuff(2, 3.3, 4.4); Ο compiler παράγει τον ορισµό της συνάρτησης Αντικαθιστά τον Tµε double Αφού η δεύτερη παράµετρος είναι τύπου double Τυπώνει στην οθόνη: 2 3.3 4.4
15 Ασυµβατότητες του compiler (1/2) ηλώσεις και ορισµοί συναρτήσεων Συνήθως τους τοποθετούµε χωριστά Για τις templates δεν υποστηρίζεται από τους περισσότερους compilers! Το ασφαλέστερο είναι να τοποθετούµετονορισµό της template συνάρτησης στο αρχείο όπου ενεργοποιείται Οι περισσότεροι compilers απαιτούν να εµφανίζεται πρώτο Συχνά κάνουµε #include όλους τους ορισµούς template
16 Ασυµβατότητες του compiler (2/2) Έλεγχος των απαιτήσεων του compiler Μερικοί χρειάζονται να θέσουµε ειδικές επιλογές (options) Μερικοί απαιτούν ειδική διάταξη του ορισµού των templates σε σχέση µε άλλα items του αρχείου Ο πιο συνήθης τρόπος οργάνωσης του προγράµµατος: Οορισµός της template στοίδιοαρχείοόπου χρησιµοποιείται Επιβεβαιώνουµε ότι ο ορισµός της template προηγείται όλων των χρήσεών της Μπορούµενατηνκάνουµε #include
17 Παράµετροι πολλαπλών τύπων Μπορούµεναέχουµε το παρακάτω: template<class T1, class T2> εν είναι πολύ συνηθισµένο Συνήθως χρειαζόµαστε µόνο έναν αντικαταστήσιµο τύπο εν µπορούµε ναέχουµε αχρησιµοποίητες παραµέτρους στην template Κάθε παράµετρος πρέπει να χρησιµοποιείται στον ορισµό ιαφορετικά σηµατοδοτείται ως Error!
18 Αφαίρεση σε υλοποίηση αλγορίθµων Αναφέρεται στην υλοποίηση templates Εκφράζει τους αλγορίθµους στη γενική τους µορφή: Ο αλγόριθµος εφαρµόζεται σε µεταβλητές οποιουδήποτε τύπου Επικεντρώνουµε στα ουσιαστικά κοµµάτια του αλγορίθµου Οι templates συναρτήσεων είναι ένας τρόπος µε τον οποίο η C++ υποστηρίζει την έννοια της αφαίρεσης στην υλοποίηση των αλγορίθµων
Στρατηγική ανάπτυξης των templates 19 Αναπτύσσουµετησυνάρτηση κανονικά Χρησιµοποιώντας τους πραγµατικούς τύπους Κάνουµε debug την κανονική συνάρτηση Κατόπιν, τη µετατρέπουµε σεtemplate Αντικαθιστούµε ταονόµατα των τύπων µε παραµέτρους τύπων, όπου χρειάζεται Πλεονεκτήµατα: Είναι ευκολότερο να επιλύσουµε την συγκεκριµένη περίπτωση Ασχολούµαστε µε τον αλγόριθµο, όχι µε τησύνταξη της template
20 Ακατάλληλοι τύποι σε templates Μπορούµεναχρησιµοποιήσουµεοποιονδήποτε τύπο σε µια template, υπό την προϋπόθεση ότι έχει νόηµα Ο κώδικας πρέπει να συµπεριφέρεται ορθά π.χ., η template συνάρτησης swapvalues() εν µπορεί να χρησιµοποιήσει τύπο δεδοµένων για τον οποίο ο τελεστής ανάθεσης δεν είναι ορισµένος Παράδειγµα: ένας πίνακας int a[10], b[10]; swapvalues(a, b); Οι πίνακες δεν µπορούν να ανατεθούν!
21 Templates κλάσεων Μπορούµε επίσηςνα γενικεύσουµε κλάσεις µε τηδήλωσηtemplate<class T> Μπορεί να εφαρµοστεί στον ορισµό µιας κλάσης Όλες οι εµφανίσεις του "T" στον ορισµό της κλάσης θα αντικατασταθούν µε τηνπαράµετρο τύπου Όπως ακριβώς και µε τιςtemplates συναρτήσεων! Αφού οριστεί η template κλάσης,µπορούµε να ορίσουµε αντικείµενα αυτής της κλάσης
22 Ορισµός template κλάσης template<class T> class Pair { public: Pair(); Pair(T firstval, T secondval); void setfirst(t newval); void setsecond(t newval); T getfirst() const; T getsecond() const; private: T first; T second; };
23 Μέλη της template κλάσης Pair template<class T> Pair<T>::Pair(T firstval, T secondval) { first = firstval; second = secondval; } template<class T> void Pair<T>::setFirst(T newval) { first = newval; }
24 Template κλάση Pair Τα αντικείµενα της κλάσης περιέχουν ζεύγη τιµών τύπου T Μπορούµεναδηλώσουµεαντικείµενα: Pair<int> score; Pair<char> seats; Τα αντικείµενα αυτά χρησιµοποιούνται όπως κάθε άλλο αντικείµενο Παραδείγµατα χρήσης: score.setfirst(3); score.setsecond(0);
Ορισµοί συναρτήσεων-µελών της Pair 25 Παρατηρήστε στους ορισµούς των συναρτήσεων- µελών: Κάθε ορισµός είναι από µόνος του µια "template" Απαιτεί να προηγείται ένα template prefix Το όνοµα της κλάσης πριν από τον τελεστή :: είναι το "Pair<T>" Όχι απλά το "Pair" Αλλά το όνοµα τουconstructor είναι απλά το "Pair" Το όνοµα τουdestructor είναι επίσης απλά το "~Pair"
26 Templates κλάσεων ως παράµετροι Θεωρήστε το: int addup(const Pair<int>& thepair); Οτύπος(int) παρέχεται να χρησιµοποιηθεί στη θέση του T στον ορισµό τηςπαραµέτρου τύπου κλάσης Εδώ έτυχε να είναι call-by-reference Ξανά: οι τύποι template µπορούν να χρησιµοποιηθούν οπουδήποτε µπορούν να χρησιµοποιηθούν και οι standard τύποι
Templates κλάσεων µέσα σε 27 templates συναρτήσεων Αντί να ορίσουµε νέαoverload συνάρτηση: template<class T> T addup(const Pair<T>& thepair); //Precondition: Operator + is defined for values of type T //Returns sum of two values in thepair Τώρα η συνάρτηση εφαρµόζεται σε όλα τα είδη αριθµών
28 Περιορισµοί στην παράµετρο τύπου Μόνο "reasonable" τύποι µπορούν να µπουν στη θέση του T Θεωρήστε τα: Ο τελεστής ανάθεσης πρέπει να συµπεριφέρεται ορθά Ο copy constructor πρέπει να ενεργεί ορθά Εάν η T εµπλέκει δείκτες, τότε ο destructor πρέπει να είναι ο κατάλληλος! Παρόµοια ζητήµατα όπως και στις templates συναρτήσεων
29 Ορισµοί τύπων Μπορούµεναορίσουµενέο όνοµα τύπου κλάσης Γιανααναπαραστήσουµε εξειδικευµένο όνοµα template κλάσης Παράδειγµα: typedef Pair<int> PairOfInt; Το όνοµα "PairOfInt" χρησιµοποιείται για να δηλώσουµεαντικείµενα τύπου Pair<int>: PairOfInt pair1, pair2; Το όνοµα µπορεί επίσης να χρησιµοποιηθεί ως παράµετρος, ή οπουδήποτε αλλού επιτρέπεται όνοµατύπου
30 Friends και templates Οι friend συναρτήσεις µπορούν να χρησιµοποιηθούν µε template κλάσεων Όµοια, όπως µε τις κανονικές κλάσεις Απλά απαιτεί παράµετρο τύπου Είναι σύνηθες να έχουµε friends σε template κλάσεις Ειδικά, για υπερφόρτωση τελεστών
31 Προκαθορισµένες template κλάσεων Η template κλάσης Vector! Μια άλλη: η template κλάσης basic_string ιαχειρίζεται αλυσίδες στοιχείων οποιουδήποτε τύπου π.χ., basic_string<char> //για char basic_string<double> //για doubles basic_string<yourclass> //για αντικείµενα YourClass
32 Η template κλάσης basic_string Την έχουµε χρησιµοποιήσει ήδη! Θυµηθείτε την κλάση "string" Είναι ένα άλλο όνοµα γιατηνκλάση basic_string<char> H basic_string ορίζεται στη βιβλιοθήκη <string> Οορισµός είναι στο namespace std
33 Templates και κληρονοµικότητα εν υπάρχει κάτι νέο Παραγόµενες template κλάσεις Μπορούν να προκύπτουν από template κλάσεις ή από µη-template κλάσεις Η παραγόµενη κλάση είναι µια template κλάση Η σύνταξη είναι όµοια µε τιςπαραγόµενες κλάσεις που προκύπτουν από κανονικές κλάσεις
34 Περίληψη Templates συναρτήσεων Ορίζουµε συναρτήσειςµε µια παράµετρο αντί για τύπο δεδοµένων Templates κλάσεων Ορίζουµε κλάσειςµε παράµετρο για υπο-κοµµάτια της κλάσης Οι προκαθορισµένες κλάσεις vector και basic_string είναι template κλάσεις Μπορούµεναορίσουµε template κλάση η οποία να παράγεται από µια βασική template κλάση
35 Περιεχόµενα Templates Standard Template Library (STL)
36 Στόχοι εκµάθησης Iterators Αµετάβλητοι (constant) και τροποποιήσιµοι (mutable) iterators Ανάστροφοι (reverse) iterators Containers Σειριακοί (sequential) containers Container adapters στοίβα και ουρά Γενικευµένοι αλγόριθµοι Ακολουθία, σύνολο, και αλγόριθµοι ταξινόµησης
37 Εισαγωγικά Θυµηθείτε τις δοµές στοίβα και ουρά Εξαιρετικά χρήσιµες Υπάρχει µεγάλη συλλογή standard δοµών δεδοµένων Είναι πρακτικό να έχουµε µια standard φορητή υλοποίηση αυτών των δοµών! Standard Template Library (STL) Περιλαµβάνει βιβλιοθήκες για πολλές τέτοιες δοµές Όπως container κλάσεις: στοίβες και ουρές
38 Iterators Θυµηθείτε: γενίκευση ενός δείκτη Τυπικά, υλοποιούνται µε έναδείκτη! Αφαίρεση των iterators Σχεδιασµένοι για να κρύψουν τις λεπτοµέρειες της υλοποίησής τους Παρέχουν οµοιόµορφο interface για διαφορετικές κλάσεις Each container class has "own" iterator type Similar to how each data type has own pointer type
39 ιαχείριση Iterators Θυµηθείτε τη χρήση των υπερφορτωµένων τελεστών: ++, --, ==,!= * Έτσι, εάν ο p είναι µια µεταβλητή τύπου iterator, ηέκφραση *p παρέχει πρόσβαση στα δεδοµένα στα οποία δείχνει ο p Template κλάση Vector Έχει όλες τις παραπάνω υπερφορτώσεις Επίσης, έχει µέλη τις begin() και end() c.begin(); //Returns iterator for 1 st item in c c.end(); //Returns "test" value for end
40 Ανακύκλωση µε Iterators Θυµηθείτε τη δυνατότητα ανακύκλωσης : for (p=c.begin(); p!=c.end(); p++) process *p //*p is current data item Κρατήστε στη µνήµη σας: Κάθε τύπος container στην STL έχει τους δικούς τους τύπους iterator Παρόλο που όλοι χρησιµοποιούνται παρόµοια
Χρήση των Iterators µε Vector (1/2) 41
Χρήση των Iterators µε Vector (2/2) 42
43 Τύποι Iterator για Vector Iterators για vectors από ints είναι τύπου: std::vector<int>::iterator Iterators για lists από ints είναι τύπου: std::list<int>::iterator Το Vector είναι στο std namespace, άρα: using std::vector<int>::iterator;
44 Είδη των Iterators ιαφορετικοί containers διαφορετικοί iterators Iterators για Vectors Ηπιογενικήµορφή Ο Vector container είναι σπουδαίος για παραδείγµατα µε iterator
Bidirectional και 45 Random-Access χρήση του Iterator
46 Κατηγοριοποίηση των Iterators Forward iterators: Ο τελεστής ++ δουλεύει πάνω σε iterator Bidirectional iterators: Οι τελεστές ++ και δουλεύουν πάνω σε iterator Random-access iterators: Οι ++, --, και random access, όλοι δουλεύουν πάνω σε iterator Αυτοί είναι είδη από iterators, όχι τύποι!
Αµετάβλητοι (constant) και 47 τροποποιήσιµοι (mutable) iterators Ησυµπεριφορά του τελεστή dereferencing (*) υπαγορεύει Αµετάβλητος iterator: Το * παράγει µια read-only έκδοση του στοιχείου Μπορούµε ναχρησιµοποιήσουµε το*p για να αναθέσουµε σεµια µεταβλητή ή για έξοδο, αλλά δεν µπορούµε να αλλάξουµε το στοιχείο στον container π.χ., *p = <anything>; είναι άκυρο Τροποποιήσιµος iterator: Στο *p µπορεί να ανατεθεί µια τιµή Αλλάζει το αντίστοιχο στοιχείο στον container ηλ., το *p επιστρέφει µια lvalue
48 Ανάστροφοι (reverse) Iterators Γιαναπαίρνουµεταστοιχείακαιµεανάστροφη σειρά Απαιτεί container µε bidirectional iterators Πιθανόν να εξετάζαµε µια λύση όπως η: iterator p; for( p=container.end();p!=container.begin(); p-- ) cout << *p << " " ; Αλλά θυµηθείτε: η end() είναι απλά ένας φρουρός, η begin() δεν είναι! Ίσως δουλέψει σε µερικά συστήµατα, άλλα όχι στα περισσότερα
49 Ο σωστός ανάστροφος Iterator Γιαναπάρουµε σωστά τα στοιχεία µε ανάστροφη σειρά: reverse_iterator p; for (rp=container.rbegin(); rp!=container.rend(); rp++) cout << *rp << " " ; rbegin() Επιστρέφει έναν iterator στο τελευταίο στοιχείο rend() Επιστρέφει έναν φρουρό σηµατοδότησης του τέλους
50 Προβλήµατα µε compiler Μερικοί compilers είναι προβληµατικοί µε τις δηλώσεις των iterators Θεωρήστε τη χρήση µας: using std::vector<char>::iterator; iterator p; Εναλλακτικά: std::vector<char>::iterator p;
51 Containers Container κλάσεις στην STL ιαφορετικά είδη δοµών δεδοµένων Όπως λίστες, ουρές, στοίβες Κάθε µια είναι µια template κλάση µε παράµετρο τον τύπο δεδοµένων που θα αποθηκευτεί π.χ., List από ints, doubles ήτύποαντικειµένων myclass Κάθε µια έχει τους δικούς της iterators Μια µπορεί να έχει bidirectional, κάποια άλλη να έχει µόνοforward iterator, κ.τ.λ. Αλλά όλοι οι τελεστές και µέλη έχουν το ίδιο νόηµα
52 Σειριακοί containers ιευθετεί δεδοµένα λίστας (list) 1 o στοιχείο, επόµενο στοιχείο, τελευταίο στοιχείο Ησυνδεδεµένη λίστα (linked list) είναι σειριακός container Οι προηγούµενες συνδεδεµένες λίστες ήταν απλά συνδεδεµένες λίστες ( singly linked lists ) Ένας σύνδεσµος ανά κόµβο Η STL δεν έχει singly linked list Μόνο doubly linked list : η template κλάση list
53 υο είδη λίστας
Χρήση της template κλάσης list (1/2) 54
Χρήση της template κλάσης list (2/2) 55
56 Container adapters στοίβα και ουρά Οι container adapters είναι template κλάσεις Υλοποιούνται πάνω από άλλες κλάσεις Παράδειγµα: Η template κλάση stack υλοποιείται εξ ορισµού επάνω από την template κλάση deque Θαµµένη στην υλοποίηση της stack είναι η deque όπου αποθηκεύονται όλα τα δεδοµένα Άλλες: queue, priority_queue
57 Καθορίζοντας container adapters Οι adapter template κλάσεις έχουν από κάτω κάποιο container που τις υποστηρίζει Αλλά, έχουµε τη δυνατότητα να καθορίσουµε διαφορετικό container Παραδείγµατα: stack template class οποιοσδήποτε σειριακός container priority_queue οεξ ορισµού είναι ο vector, θα µπορούσε να είναι κάποιος άλλος Παράδειγµακαθορισµού: stack<int, vector<int>> Κάνει την κλάση vector να είναι ο container κάτω από τη stack
58 Associative containers Associative container: απλή βάση δεδοµένων Αποθηκεύει δεδοµένα Κάθε δεδοµένο έχει ένα κλειδί Παράδειγµα: data: employee s record ως struct key: employee s SSN Τα items ανακτώνται µεβάσητοκλειδί
59 Η template κλάση set (1/2) Οαπλούστεροςδυνατόςcontainer Αποθηκεύει στοιχεία χωρίς επανάληψη Η 1 η εισαγωγή τοποθετεί ένα στοιχείο στο σύνολο Κάθε στοιχείο είναι ένα κλειδί από µόνο του υνατότητες: Προσθήκη στοιχείων ιαγραφή στοιχείων Έλεγχος εάν κάποιο στοιχείο ανήκει στο σύνολο
60 Η template κλάση set (2/2) Σχεδιάστηκε ώστε να είναι αποδοτική Αποθηκεύει τιµές σε ταξινοµηµένη σειρά Μπορούµε να καθορίσουµε τη διάταξη: set<t, Ordering> s; Η διάταξη λειτουργεί ορθά και επιστρέφει bool Εάν δεν καθοριστεί καµία: χρήση του σχεσιακού τελεστή <
61 Η template κλάση Map Μια συνάρτηση που δίνεται ως σύνολο διατεταγµένων ζευγών Για κάθε µια τιµή first, το πολύ µια τιµή second στη map Παράδειγµα δήλωσης map: map<string, int> numbermap; Αποθηκεύονται σε ταξινοµηµένη διάταξη, όπως το set Second value can have no ordering impact
62 Γενικευµένοι αλγόριθµοι Βασικές template συναρτήσεις Θυµηθείτε τον ορισµό τουαλγορίθµου: Σύνολο εντολών για εκτέλεση µιας λειτουργίας Μπορεί να αναπαρασταθεί σε οποιαδήποτε γλώσσα Τυπικά σε "pseudocode" Θεωρείται αφαίρεση του κώδικα ίνει σηµαντικές λεπτοµέρειες, αλλά όχι λεπτοµέρειες του κώδικα Οι αλγόριθµοι της STL σε template συναρτήσεις: Παρέχονται µερικές µόνο λεπτοµέρειες Εποµένων θεωρούνται γενικευµένοι αλγόριθµοι
63 Χρόνοι εκτέλεσης για container O(1) σταθερή λειτουργία: Εισαγωγές σε Vector (στην αρχή ή τέλος) Εισαγωγές σε deque Εισαγωγές σε list O(N) Εισαγωγή ή διαγραφή τυχαίου στοιχείου σε vector ή deque (N είναι ο αριθµός των στοιχείων) O(log N) Εύρεση σε set ή map
Αλγόριθµοι που δεν τροποποιούν 64 ακολουθίες Template συναρτήσεις που επενεργούν σε containers ΕΝ τροποποιούν τα περιεχόµενα του container Ηγενικήσυνάρτησηfind Τυπικό παράδειγµα Μπορεί να χρησιµοποιηθεί µε οποιαδήποτε σειριακή container κλάση της STL
65 Η συνάρτηση find (1/3)
66 Η συνάρτηση find (2/3)
67 Η συνάρτηση find (3/3)
68 Αλγόριθµ. τροποποίησης ακολουθίας STL συναρτήσεις που τροποποιούν τα περιεχόµενα ενός container Θυµηθείτε: προσθήκη/διαγραφή στοιχείων από containers µπορεί να επηρεάσει άλλους iterators! Οι list και slist εγγυώνται µη-τροποποίηση σε iterator Οι vector και deque ΕΝ παρέχουν τέτοια εγγύηση Πάντοτε παρακολουθούµε ποιοι iterators είναι εγγυηµένο ότι θα αλλαχτούν/δεν θα αλλαχτούν
69 Αλγόριθµοι συνόλων Η STL περιέχει συναρτήσεις που υλοποιούν τις γενικές λειτουργίες πάνω σε σύνολα Όλες υποθέτουν ότι τα στοιχεία των containers αποθηκεύονται σε ταξινοµηµένη διάταξη Containers set, map, multiset, multimap ΕΊΝΑΙ ταξινοµηµένοι, και συνεπώς οι συναρτήσεις συνόλων εφαρµόζονται Άλλες, όπως η vector, δεν είναι ταξινοµηµένες εν θα έπρεπε να χρησιµοποιούνται συναρτήσεις συνόλων
70 Αλγόριθµοι ταξινόµησης Η STL περιέχει δυο template συναρτήσεις: 1. sort (ταξινόµηση) συλλογής στοιχείων 2. merge (συγχώνευση) δυο ταξινοµηµένων συλλογών στοιχείων Εγγυηµένος χρόνος εκτέλεσης O(N log N) Κανένας αλγόριθµος ταξινόµησης δεν µπορεί να είναι ταχύτερος Η συνάρτηση εγγυάται την ταχύτερη δυνατή ταξινόµηση