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

Σχετικά έγγραφα
ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ 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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Week. 6: Java Collections

JDSL Java Data Structures Library

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΗΥ-150. Πίνακες (Arrays)

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

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

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

Boost - Boost Graph Library C++ library

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

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

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

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

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

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

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

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

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

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

Βασικά της γλώσσας JAVA

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

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

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

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

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

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

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

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

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

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

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

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

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

Πληροφορική 2. Γλώσσες Προγραμματισμού

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

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

Transcript:

1 Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 11η Ιστοσελίδα του µαθήµατος 2 http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος Επικοινωνία: dimitris@skyblue.csd.auth.gr Περιεχόµενα 3 Templates Standard Template Library (STL) 1

Στόχοι εκµάθησης Templates συναρτήσεων Σύνταξη, ορισµός Ασυµβατότητες του compiler Templates κλάσεων Σύνταξη Παράδειγµα: template κλάση για πίνακα Templates και κληρονοµικότητα Παράδειγµα: template κλάση για µερικώς πληρωµένο πίνακα 4 Εισαγωγικά 5 Templates στη C++ Επιτρέπουν πολύ γενικούς ορισµούς για συναρτήσεις και κλάσεις Τα ονόµατα των τύπων είναι παράµετροι αντί να δηλώνονται οι πραγµατικοί τύποι Ο ακριβής ορισµός των τύπων προσδιορίζεται κατά την εκτέλεση του κώδικα Templates συναρτήσεων 6 Έστω µια συνάρτηση για αντιµετάθεση τιµών, η συνάρτηση swapvalues: void swapvalues(int& var1, int& var2) { int temp; temp = var1; var1 = var2; var2 = temp; } Εφαρµόζεται µόνο για µεταβλητές τύπου int Φυσικά ο κώδικας είναι ΟΚ για οποιοδήποτε τύπο δεδοµένων! 2

7 Templates συναρτήσεων & υπερφόρτωση Θα µπορούσαµε να κάνουµε overload τη συνάρτηση ώστε να δέχεται ορίσµατα char: void swapvalues(char& var1, char& var2) { char temp; temp = var1; var1 = var2; var2 = temp; } Αλλά παρατηρήστε: ο κώδικας είναι σχεδόν πανοµοιότυπος! Η µόνη διαφορά είναι ο τύπος δεδοµένων που χρησιµοποιείται σε 3 σηµεία Σύνταξη 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 είναι µια παράµερος τύπου δεδοµένων 8 Template Prefix (1/2) 9 Θυµηθείτε: template<class T> Σ αυτή τη χρήση, το "class" σηµαίνει "type", ή "classification" Μπορεί να γίνει σύγχυση µε άλλες γνωστές χρήσεις της λέξης "class"! Η C++ επιτρέπει λέξη-κλειδί "typename" στη θέση της λέξη-κλειδί class εδώ Αλλά συνήθως χρησιµοποιούµε τη λέξη "class" 3

Template Prefix (2/2) 10 Ξανά: template<class T> Το T µπορεί να αντικατασταθεί µε οποιοδήποτε τύπο Προκαθορισµένο ή ορισµένο από το χρήστη (όπως µια κλάση) Στο σώµα της συνάρτησης: Το T χρησιµοποιείται όπως οποιοσδήποτε άλλος τύπος Σηµειώστε: µπορούµε να χρησιµοποιήσουµε οποιοδήποτε άλλο σύµβολο εκτός από το "T", αλλά το T χρησιµοποιείται παραδοσιακά Ορισµός Template συνάρτησης 11 Η template συνάρτησης swapvalues() είναι στην πραγµατικότητα µια συλλογή ορισµών! Ένας ορισµός για κάθε πιθανό τύπο! Ο compiler παράγει ορισµούς µόνο όταν απαιτείται Αλλά είναι σαν να είχαµε δηµιουργήσει όλους αυτούς τους ορισµούς Γράφουµε έναν ορισµό δουλεύει για όλους τους τύπους που µπορεί να φτιάξουµε Κλήση µιας template συνάρτησης 12 Θεωρήστε την επόµενη κλήση: swapvalues(int1, int2); Ο C++ compiler παράγει τον ορισµό της συνάρτησης για δυο int παραµέτρους χρησιµοποιώντας την template Το ίδιο για όλους τους άλλους τύπους εν χρειάζεται να κάνει κάτι ιδιαίτερο για την κλήση Ο απαιτούµενος ορισµός παράγεται αυτόµατα 4

Μια άλλη template συνάρτησης 13 ήλωση/πρωτότυπο: 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; } Κλήση showstuff 14 Θεωρήστε την κλήση: showstuff(2, 3.3, 4.4); Ο compiler παράγει τον ορισµό της συνάρτησης Αντικαθιστά τον T µε double Αφού η δεύτερη παράµετρος είναι τύπου double Τυπώνει στην οθόνη: 2 3.3 4.4 Ασυµβατότητες του compiler (1/2) 15 ηλώσεις και ορισµοί συναρτήσεων Συνήθως τους τοποθετούµε χωριστά Για τις templates δεν υποστηρίζεται από τους περισσότερους compilers! Το ασφαλέστερο είναι να τοποθετούµε τον ορισµό της template συνάρτησης στο αρχείο όπου ενεργοποιείται Οι περισσότεροι compilers απαιτούν να εµφανίζεται πρώτο Συχνά κάνουµε #include όλους τους ορισµούς template 5

Ασυµβατότητες του compiler (2/2) 16 Έλεγχος των απαιτήσεων του compiler Μερικοί χρειάζονται να θέσουµε ειδικές επιλογές (options) Μερικοί απαιτούν ειδική διάταξη του ορισµού των templates σε σχέση µε άλλα items του αρχείου Ο πιο συνήθης τρόπος οργάνωσης του προγράµµατος: Ο ορισµός της template στο ίδιο αρχείο όπου χρησιµοποιείται Επιβεβαιώνουµε ότι ο ορισµός της template προηγείται όλων των χρήσεών της Μπορούµε να την κάνουµε #include Παράµετροι πολλαπλών τύπων 17 Μπορούµε να έχουµε το παρακάτω: template<class T1, class T2> εν είναι πολύ συνηθισµένο Συνήθως χρειαζόµαστε µόνο έναν αντικαταστήσιµο τύπο εν µπορούµε να έχουµε αχρησιµοποίητες παραµέτρους στην template Κάθε παράµετρος πρέπει να χρησιµοποιείται στον ορισµό ιαφορετικά σηµατοδοτείται ως Error! Αφαίρεση σε υλοποίηση αλγορίθµων 18 Αναφέρεται στην υλοποίηση templates Εκφράζει τους αλγορίθµους στη γενική τους µορφή: Ο αλγόριθµος εφαρµόζεται σε µεταβλητές οποιουδήποτε τύπου Επικεντρώνουµε στα ουσιαστικά κοµµάτια του αλγορίθµου Οι templates συναρτήσεων είναι ένας τρόπος µε τον οποίο η C++ υποστηρίζει την έννοια της αφαίρεσης στην υλοποίηση των αλγορίθµων 6

19 Στρατηγική ανάπτυξης των templates Αναπτύσσουµε τη συνάρτηση κανονικά Χρησιµοποιώντας τους πραγµατικούς τύπους Κάνουµε debug την κανονική συνάρτηση Κατόπιν, τη µετατρέπουµε σε template Αντικαθιστούµε τα ονόµατα των τύπων µε παραµέτρους τύπων, όπου χρειάζεται Πλεονεκτήµατα: Είναι ευκολότερο να επιλύσουµε την συγκεκριµένη περίπτωση Ασχολούµαστε µε τον αλγόριθµο, όχι µε τη σύνταξη της template Ακατάλληλοι τύποι σε templates 20 Μπορούµε να χρησιµοποιήσουµε οποιονδήποτε τύπο σε µια template, υπό την προϋπόθεση ότι έχει νόηµα Ο κώδικας πρέπει να συµπεριφέρεται ορθά π.χ., η template συνάρτησης swapvalues() εν µπορεί να χρησιµοποιήσει τύπο δεδοµένων για τον οποίο ο τελεστής ανάθεσης δεν είναι ορισµένος Παράδειγµα: ένας πίνακας int a[10], b[10]; swapvalues(a, b); Οι πίνακες δεν µπορούν να ανατεθούν! Templates κλάσεων Μπορούµε επίσης να γενικεύσουµε κλάσεις µε τη δήλωση template<class T> Μπορεί να εφαρµοστεί στον ορισµό µιας κλάσης Όλες οι εµφανίσεις του "T" στον ορισµό της κλάσης θα αντικατασταθούν µε την παράµετρο τύπου Όπως ακριβώς και µε τις templates συναρτήσεων! Αφού οριστεί η template κλάσης, µπορούµε να ορίσουµε αντικείµενα αυτής της κλάσης 21 7

Ορισµός 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; }; 22 Μέλη της 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; } 23 Template κλάση Pair 24 Τα αντικείµενα της κλάσης περιέχουν ζεύγη τιµών τύπου T Μπορούµε να δηλώσουµε αντικείµενα: Pair<int> score; Pair<char> seats; Τα αντικείµενα αυτά χρησιµοποιούνται όπως κάθε άλλο αντικείµενο Παραδείγµατα χρήσης: score.setfirst(3); score.setsecond(0); 8

25 Ορισµοί συναρτήσεων-µελών της Pair Παρατηρήστε στους ορισµούς των συναρτήσεων- µελών: Κάθε ορισµός είναι από µόνος του µια "template" Απαιτεί να προηγείται ένα template prefix Το όνοµα της κλάσης πριν από τον τελεστή :: είναι το "Pair<T>" Όχι απλά το "Pair" Αλλά το όνοµα του constructor είναι απλά το "Pair" Το όνοµα του destructor είναι επίσης απλά το "~Pair" Templates κλάσεων ως παράµετροι 26 Θεωρήστε το: int addup(const Pair<int>& thepair); Ο τύπος (int) παρέχεται να χρησιµοποιηθεί στη θέση του T στον ορισµό της παραµέτρου τύπου κλάσης Εδώ έτυχε να είναι call-by-reference Ξανά: οι τύποι template µπορούν να χρησιµοποιηθούν οπουδήποτε µπορούν να χρησιµοποιηθούν και οι standard τύποι Templates κλάσεων µέσα σε templates συναρτήσεων 27 Αντί να ορίσουµε νέα 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 Τώρα η συνάρτηση εφαρµόζεται σε όλα τα είδη αριθµών 9

Περιορισµοί στην παράµετρο τύπου 28 Μόνο "reasonable" τύποι µπορούν να µπουν στη θέση του T Θεωρήστε τα: Ο τελεστής ανάθεσης πρέπει να συµπεριφέρεται ορθά Ο copy constructor πρέπει να ενεργεί ορθά Εάν η T εµπλέκει δείκτες, τότε ο destructor πρέπει να είναι ο κατάλληλος! Παρόµοια ζητήµατα όπως και στις templates συναρτήσεων Ορισµοί τύπων 29 Μπορούµε να ορίσουµε νέο όνοµα τύπου κλάσης Για να αναπαραστήσουµε εξειδικευµένο όνοµα template κλάσης Παράδειγµα: typedef Pair<int> PairOfInt; Το όνοµα "PairOfInt" χρησιµοποιείται για να δηλώσουµε αντικείµενα τύπου Pair<int>: PairOfInt pair1, pair2; Το όνοµα µπορεί επίσης να χρησιµοποιηθεί ως παράµετρος, ή οπουδήποτε αλλού επιτρέπεται όνοµα τύπου Friends και templates 30 Οι friend συναρτήσεις µπορούν να χρησιµοποιηθούν µε template κλάσεων Όµοια, όπως µε τις κανονικές κλάσεις Απλά απαιτεί παράµετρο τύπου Είναι σύνηθες να έχουµε friends σε template κλάσεις Ειδικά, για υπερφόρτωση τελεστών 10

31 Προκαθορισµένες template κλάσεων Η template κλάσης Vector! Μια άλλη: η template κλάσης basic_string ιαχειρίζεται αλυσίδες στοιχείων οποιουδήποτε τύπου π.χ., basic_string<char> //για char basic_string<double> //για doubles basic_string<yourclass> //για αντικείµενα YourClass Η template κλάσης basic_string 32 Την έχουµε χρησιµοποιήσει ήδη! Θυµηθείτε την κλάση "string" Είναι ένα άλλο όνοµα για την κλάση basic_string<char> H basic_string ορίζεται στη βιβλιοθήκη <string> Ο ορισµός είναι στο namespace std Templates και κληρονοµικότητα 33 εν υπάρχει κάτι νέο Παραγόµενες template κλάσεις Μπορούν να προκύπτουν από template κλάσεις ή από µη-template κλάσεις Η παραγόµενη κλάση είναι µια template κλάση Η σύνταξη είναι όµοια µε τις παραγόµενες κλάσεις που προκύπτουν από κανονικές κλάσεις 11

Περίληψη 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 στοίβα και ουρά Γενικευµένοι αλγόριθµοι Ακολουθία, σύνολο, και αλγόριθµοι ταξινόµησης 12

Εισαγωγικά 37 Θυµηθείτε τις δοµές στοίβα και ουρά Εξαιρετικά χρήσιµες Υπάρχει µεγάλη συλλογή standard δοµών δεδοµένων Είναι πρακτικό να έχουµε µια standard φορητή υλοποίηση αυτών των δοµών! Standard Template Library (STL) Περιλαµβάνει βιβλιοθήκες για πολλές τέτοιες δοµές Όπως container κλάσεις: στοίβες και ουρές Iterators 38 Θυµηθείτε: γενίκευση ενός δείκτη Τυπικά, υλοποιούνται µε ένα δείκτη! Αφαίρεση των iterators Σχεδιασµένοι για να κρύψουν τις λεπτοµέρειες της υλοποίησής τους Παρέχουν οµοιόµορφο interface για διαφορετικές κλάσεις Each container class has "own" iterator type Similar to how each data type has own pointer type ιαχείριση Iterators 39 Θυµηθείτε τη χρήση των υπερφορτωµένων τελεστών: ++, --, ==,!= * Έτσι, εάν ο 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 13

Ανακύκλωση µε Iterators 40 Θυµηθείτε τη δυνατότητα ανακύκλωσης : for (p=c.begin(); p!=c.end(); p++) process *p //*p is current data item Κρατήστε στη µνήµη σας: Κάθε τύπος container στην STL έχει τους δικούς τους τύπους iterator Παρόλο που όλοι χρησιµοποιούνται παρόµοια 41 Χρήση των Iterators µε Vector (1/2) 42 Χρήση των Iterators µε Vector (2/2) 14

Τύποι Iterator για Vector 43 Iterators για vectors από ints είναι τύπου: std::vector<int>::iterator Iterators για lists από ints είναι τύπου: std::list<int>::iterator Το Vector είναι στο std namespace, άρα: using std::vector<int>::iterator; Είδη των Iterators 44 ιαφορετικοί containers διαφορετικοί iterators Iterators για Vectors Η πιο γενική µορφή Ο Vector container είναι σπουδαίος για παραδείγµατα µε iterator Bidirectional και Random-Access χρήση του Iterator 45 15

Κατηγοριοποίηση των Iterators 46 Forward iterators: Ο τελεστής ++ δουλεύει πάνω σε iterator Bidirectional iterators: Οι τελεστές ++ και δουλεύουν πάνω σε iterator Random-access iterators: Οι ++, --, και random access, όλοι δουλεύουν πάνω σε iterator Αυτοί είναι είδη από iterators, όχι τύποι! Αµετάβλητοι (constant) και τροποποιήσιµοι (mutable) iterators Η συµπεριφορά του τελεστή dereferencing (*) υπαγορεύει Αµετάβλητος iterator: Το * παράγει µια read-only έκδοση του στοιχείου Μπορούµε να χρησιµοποιήσουµε το *p για να αναθέσουµε σε µια µεταβλητή ή για έξοδο, αλλά δεν µπορούµε να αλλάξουµε το στοιχείο στον container π.χ., *p = <anything>; είναι άκυρο Τροποποιήσιµος iterator: Στο *p µπορεί να ανατεθεί µια τιµή Αλλάζει το αντίστοιχο στοιχείο στον container ηλ., το *p επιστρέφει µια lvalue 47 Ανάστροφοι (reverse) Iterators 48 Για να παίρνουµε τα στοιχεία και µε ανάστροφη σειρά Απαιτεί container µε bidirectional iterators Πιθανόν να εξετάζαµε µια λύση όπως η: iterator p; for( p=container.end();p!=container.begin(); p-- ) cout << *p << " " ; Αλλά θυµηθείτε: η end() είναι απλά ένας φρουρός, η begin() δεν είναι! Ίσως δουλέψει σε µερικά συστήµατα, άλλα όχι στα περισσότερα 16

Ο σωστός ανάστροφος Iterator 49 Για να πάρουµε σωστά τα στοιχεία µε ανάστροφη σειρά: reverse_iterator p; for (rp=container.rbegin(); rp!=container.rend(); rp++) cout << *rp << " " ; rbegin() Επιστρέφει έναν iterator στο τελευταίο στοιχείο rend() Επιστρέφει έναν φρουρό σηµατοδότησης του τέλους Προβλήµατα µε compiler 50 Μερικοί compilers είναι προβληµατικοί µε τις δηλώσεις των iterators Θεωρήστε τη χρήση µας: using std::vector<char>::iterator; iterator p; Εναλλακτικά: std::vector<char>::iterator p; Containers 51 Container κλάσεις στην STL ιαφορετικά είδη δοµών δεδοµένων Όπως λίστες, ουρές, στοίβες Κάθε µια είναι µια template κλάση µε παράµετρο τον τύπο δεδοµένων που θα αποθηκευτεί π.χ., List από ints, doubles ή τύπο αντικειµένων myclass Κάθε µια έχει τους δικούς της iterators Μια µπορεί να έχει bidirectional, κάποια άλλη να έχει µόνοforward iterator, κ.τ.λ. Αλλά όλοι οι τελεστές και µέλη έχουν το ίδιο νόηµα 17

Σειριακοί containers 52 ιευθετεί δεδοµένα λίστας (list) 1 o στοιχείο, επόµενο στοιχείο, τελευταίο στοιχείο Η συνδεδεµένη λίστα (linked list) είναι σειριακός container Οι προηγούµενες συνδεδεµένες λίστες ήταν απλά συνδεδεµένες λίστες ( singly linked lists ) Ένας σύνδεσµος ανά κόµβο Η STL δεν έχει singly linked list Μόνο doubly linked list : η template κλάση list υο είδη λίστας 53 54 Χρήση της template κλάσης list (1/2) 18

55 Χρήση της template κλάσης list (2/2) Container adapters στοίβα και ουρά 56 Οι container adapters είναι template κλάσεις Υλοποιούνται πάνω από άλλες κλάσεις Παράδειγµα: Η template κλάση stack υλοποιείται εξ ορισµού επάνω από την template κλάση deque Θαµµένη στην υλοποίηση της stack είναι η deque όπου αποθηκεύονται όλα τα δεδοµένα Άλλες: queue, priority_queue Καθορίζοντας container adapters 57 Οι adapter template κλάσεις έχουν από κάτω κάποιο container που τις υποστηρίζει Αλλά, έχουµε τη δυνατότητα να καθορίσουµε διαφορετικό container Παραδείγµατα: stack template class οποιοσδήποτε σειριακός container priority_queue ο εξ ορισµού είναι ο vector, θα µπορούσε να είναι κάποιος άλλος Παράδειγµα καθορισµού: stack<int, vector<int>> Κάνει την κλάση vector να είναι ο container κάτω από τη stack 19

Associative containers 58 Associative container: απλή βάση δεδοµένων Αποθηκεύει δεδοµένα Κάθε δεδοµένο έχει ένα κλειδί Παράδειγµα: data: employee s record ως struct key: employee s SSN Τα items ανακτώνται µε βάση το κλειδί Η template κλάση set (1/2) 59 Ο απλούστερος δυνατός container Αποθηκεύει στοιχεία χωρίς επανάληψη Η 1 η εισαγωγή τοποθετεί ένα στοιχείο στο σύνολο Κάθε στοιχείο είναι ένα κλειδί από µόνο του υνατότητες: Προσθήκη στοιχείων ιαγραφή στοιχείων Έλεγχος εάν κάποιο στοιχείο ανήκει στο σύνολο Η template κλάση set (2/2) 60 Σχεδιάστηκε ώστε να είναι αποδοτική Αποθηκεύει τιµές σε ταξινοµηµένη σειρά Μπορούµε να καθορίσουµε τη διάταξη: set<t, Ordering> s; Η διάταξη λειτουργεί ορθά και επιστρέφει bool Εάν δεν καθοριστεί καµία: χρήση του σχεσιακού τελεστή < 20

Η template κλάση Map 61 Μια συνάρτηση που δίνεται ως σύνολο διατεταγµένων ζευγών Για κάθε µια τιµή first, το πολύ µια τιµή second στη map Παράδειγµα δήλωσης map: map<string, int> numbermap; Αποθηκεύονται σε ταξινοµηµένη διάταξη, όπως το set Second value can have no ordering impact Γενικευµένοι αλγόριθµοι 62 Βασικές template συναρτήσεις Θυµηθείτε τον ορισµό του αλγορίθµου: Σύνολο εντολών για εκτέλεση µιας λειτουργίας Μπορεί να αναπαρασταθεί σε οποιαδήποτε γλώσσα Τυπικά σε "pseudocode" Θεωρείται αφαίρεση του κώδικα ίνει σηµαντικές λεπτοµέρειες, αλλά όχι λεπτοµέρειες του κώδικα Οι αλγόριθµοι της STL σε template συναρτήσεις: Παρέχονται µερικές µόνο λεπτοµέρειες Εποµένων θεωρούνται γενικευµένοι αλγόριθµοι Χρόνοι εκτέλεσης για container 63 O(1) σταθερή λειτουργία: Εισαγωγές σε Vector (στην αρχή ή τέλος) Εισαγωγές σε deque Εισαγωγές σε list O(N) Εισαγωγή ή διαγραφή τυχαίου στοιχείου σε vector ή deque (N είναι ο αριθµός των στοιχείων) O(log N) Εύρεση σε set ή map 21

Αλγόριθµοι που δεν τροποποιούν ακολουθίες 64 Template συναρτήσεις που επενεργούν σε containers ΕΝ τροποποιούν τα περιεχόµενα του container Η γενική συνάρτηση find Τυπικό παράδειγµα Μπορεί να χρησιµοποιηθεί µε οποιαδήποτε σειριακή container κλάση της STL Η συνάρτηση find (1/3) 65 Η συνάρτηση find (2/3) 66 22

Η συνάρτηση find (3/3) 67 Αλγόριθµ. τροποποίησης ακολουθίας 68 STL συναρτήσεις που τροποποιούν τα περιεχόµενα ενός container Θυµηθείτε: προσθήκη/διαγραφή στοιχείων από containers µπορεί να επηρεάσει άλλους iterators! Οι list και slist εγγυώνται µη-τροποποίηση σε iterator Οι vector και deque ΕΝ παρέχουν τέτοια εγγύηση Πάντοτε παρακολουθούµε ποιοι iterators είναι εγγυηµένο ότι θα αλλαχτούν/δεν θα αλλαχτούν Αλγόριθµοι συνόλων 69 Η STL περιέχει συναρτήσεις που υλοποιούν τις γενικές λειτουργίες πάνω σε σύνολα Όλες υποθέτουν ότι τα στοιχεία των containers αποθηκεύονται σε ταξινοµηµένη διάταξη Containers set, map, multiset, multimap ΕΊΝΑΙ ταξινοµηµένοι, και συνεπώς οι συναρτήσεις συνόλων εφαρµόζονται Άλλες, όπως η vector, δεν είναι ταξινοµηµένες εν θα έπρεπε να χρησιµοποιούνται συναρτήσεις συνόλων 23

Αλγόριθµοι ταξινόµησης 70 Η STL περιέχει δυο template συναρτήσεις: 1. sort (ταξινόµηση) συλλογής στοιχείων 2. merge (συγχώνευση) δυο ταξινοµηµένων συλλογών στοιχείων Εγγυηµένος χρόνος εκτέλεσης O(N log N) Κανένας αλγόριθµος ταξινόµησης δεν µπορεί να είναι ταχύτερος Η συνάρτηση εγγυάται την ταχύτερη δυνατή ταξινόµηση 24