ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

Σχετικά έγγραφα
Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

Standard Template Library (STL) C++ library

Δομές Δεδομένων Standard Template Library (STL) 23/3/2017 ΜΠΟΜΠΟΤΑΣ ΑΓΟΡΑΚΗΣ

Standard Template Library (STL)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D.

Τεχνολογίες Υλοποίησης Αλγορίθµων

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Πίνακες.

Μάθημα 21: Ουρές (Queues)

Τεχνολογίες Υλοποίησης Αλγορίθµων

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

19. ΠΡΟΤΥΠΑ (TEMPLATES)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Αντικειμενοστραφής Προγραμματισμός

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Αλφαριθµητικά Κλάση string

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συλλογές και Επαναλήπτες. Συλλογές - Collections

Δομές Δεδομένων. Λουκάς Γεωργιάδης.

JDSL Java Data Structures Library

Οντοκεντρικός Προγραμματισμός

Week. 6: Java Collections

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Πρότυπα και διανύσματα

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Βασικές Έννοιες Δοµών Δεδοµένων

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

Συλλογές ΣΥΛΛΟΓΕΣ. Γεώργιος Παπαϊωάννου ( )

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

17TimeThis.h function returns reference pointer to same object { return *this; }

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

Δομές Δεδομένων & Αλγόριθμοι

Δομές δεδομένων (2) Αλγόριθμοι

Αναφορές, είκτες και Αλφαριθμητικά

Κλάσεις και Αντικείµενα

Οντοκεντρικός Προγραμματισμός

Περιεχόμενα. Λίγα λόγια για αυτή την έκδοση... 23

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

Αντικειµενοστρεφής Προγραµµατισµός

υναµικές οµές εδοµένων

Δομές Δεδομένων. Λουκάς Γεωργιάδης.

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Υπερφόρτωση τελεστών

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Συλλογές, Στοίβες και Ουρές

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

5. ΣΥΝΑΡΤΗΣΕΙΣ. (Πρόχειρο σχέδιο - Μαθήµατος 3) p Συναρτήσεις, που δεν επιστρέφουν κάποια τιµή

Οντοκεντρικός Προγραμματισμός

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός Υπολογιστών με C++

ιαφάνειες παρουσίασης #5 (β)

Boost - Boost Graph Library C++ library

ΣΧΕΔΙΟΤΥΠΑ (TEMPLATES)

Δομημένος Προγραμματισμός

Κεφάλαιο 10 ο Υποπρογράµµατα

Γ7.2 Συμβολοσειρές (Strings) Γ Λυκείου Κατεύθυνσης

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

8. Μέθοδοι (Methods)

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Υπολογιστών με C++

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Ερώτημα Α 1. Να γράψετε τις εντολές που πραγματοποιούν τα ακόλουθα:

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι περιλαμβάνει μια μεταβλητή; ΔΕΙΚΤΕΣ. Διεύθυνση μεταβλητής. Δείκτης

Φροντιςτήριο. Linked-List

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΚΕΦΑΛΑΙΟ 2: Τύποι δεδομένων και εμφάνιση στοιχείων...33

Προχωρημένα Θέματα ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ. Γεώργιος Παπαϊωάννου ( )

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Στοιχειώδης προγραμματισμός σε C++

Συναρτήσεις και Πίνακες

HY-252 Αντικειμενοστραφής Προγραμματισμός. Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης. Ημερομηνία Παράδοσης: 16/11/2012

Οντοκεντρικός Προγραμματισμός

Δομές Δεδομένων & Αλγόριθμοι

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

Week 7: Java Collection Classes

Transcript:

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) Κανένας αλγόριθµος ταξινόµησης δεν µπορεί να είναι ταχύτερος Η συνάρτηση εγγυάται την ταχύτερη δυνατή ταξινόµηση