Standard Template Library (STL) Η χαρά του προγραμματιστή δαίμων - τεύχος 6 Μορφονιός Κωνσταντίνος http://www.di.uoa.gr/~kmorfo K.Morfonios@di.uoa.gr
Περιεχόμενα Τι είναι; Containers Algorithms Iterators Παραδείγματα Αναφορές
Τι είναι; Βιβλιοθήκη της C++ που προσφέρει: Containers Algorithms Iterators
Τι είναι; Γιατί χρειάζεται; Οι περισσότεροι έχουν προγραμματίσει διπλά συνδεδεμένη λίστα, πίνακα κατακερματισμού και σύνολα. ΑΛΛΑ Σε πόσο χρόνο; Memory leaks και debugging; Ήταν template; Είχε αποδοτικές μεθόδους (αναζήτηση, εισαγωγή, ταξινόμηση, συγχώνευση, ένωση, τομή, αφαίρεση διπλοτύπων, );
Τι είναι; Πλεονεκτήματα: Χρόνος ανάπτυξης και debugging Διαχείριση μνήμης Μικρότερο μέγεθος κώδικα Βασίζεται σε template classes Εύκολη στη χρήση
Τι είναι; Κάτι νέο; 1979 Alexander Stepanow στη HP Αργότερα David Musser και Meng Lee 1994: Προστέθηκε στο πρότυπο ANSI C++
Containers Βασικά συστατικά της STL Δομές δεδομένων Αποθηκεύουν και διαχειρίζονται τα πραγματικά δεδομένα Χωρίζονται σε 2 κατηγορίες: Sequences Associative containers
Containers Sequences: Διατεταγμένοι πίνακες αντικειμένων μεταβλητού μήκους vector deque list Επιτρέπουν εισαγωγή και διαγραφή στοιχείων σε οποιοδήποτε σημείο Βασική διαφορά: Το κόστος εξαρτάται από τον τύπο
Containers vector: Κόστος εισαγωγής στην αρχή σταθερό Κόστος εισαγωγής στο τέλος γραμμικό Κόστος εισαγωγής στη μέση γραμμικό Επιτρέπει τυχαία προσπέλαση
Containers deque: Κόστος εισαγωγής στην αρχή σταθερό Κόστος εισαγωγής στο τέλος σταθερό Κόστος εισαγωγής στη μέση γραμμικό Επιτρέπει τυχαία προσπέλαση
Containers list: Κόστος εισαγωγής στην αρχή σταθερό Κόστος εισαγωγής στο τέλος σταθερό Κόστος εισαγωγής στη μέση σταθερό Επιτρέπει όμως μόνο σειριακή προσπέλαση
Containers Associative containers: Γενίκευση των sequences map multimap set multiset Βασική διαφορά: Δεν δεικτοδοτούνται από ακεραίους αλλά από κάποιο κλειδί Το κλειδί αυτό μπορεί να είναι οποιουδήποτε τύπου
Containers map: Αποθηκεύει ζεύγη της μορφής <key, value> Κάτι σαν πίνακας κατακερματισμού (αλλά ) Επιτρέπει εισαγωγή, διαγραφή και αναζήτηση με κόστος λογαριθμικό Επιτρέπει ακόμα σειριακή προσπέλαση όλων των στοιχείων Δεν επιτρέπονται διπλότυπα κλειδιά
Containers multimap: Όμοιο με το map με τη διαφορά ότι επιτρέπονται διπλότυπα κλειδιά
Containers set: Το κλασσικό σύνολο Όμοιο με το map με τη διαφορά ότι οι ίδιες οι τιμές παίζουν και το ρόλο του κλειδιού Επιτρέπει εισαγωγή, διαγραφή και αναζήτηση με κόστος λογαριθμικό Επιτρέπει ακόμα σειριακή προσπέλαση όλων των στοιχείων Δεν επιτρέπονται διπλότυπα
Containers multiset: Όμοιο με το set με τη διαφορά ότι επιτρέπονται διπλότυπα
Algorithms Πρόκειται για πλούσια συλλογή από template C++ functions που λειτουργούν πάνω σε containers Περιλαμβάνουν Ταξινόμηση (sort, merge, min, max, ) Αναζήτηση (find, count, equal, ) Μετασχηματισμούς (transform, replace, fill, rotate, nth_element, random_shuffle, ) Πράξεις συνόλων (includes, set_difference, set_intersection, set_union, )
Iterators Οι containers προσφέρουν δυνατότητα προσπέλασης των στοιχείων τους μέσω iterators Πρόκειται για δείκτες στα στοιχεία ενός container Βοηθούν στη σάρωση όλων των στοιχείων ενός container Κάθε container ορίζει έναν ή περισσότερους τύπους iterators που μπορούμε να χρησιμοποιήσουμε
Iterators Υπάρχουν 5 τύποι: Random access Bidirectional Forward Input Output
Παράδειγμα 1 #include "stdafx.h" #include <iostream.h> #include <algorithm> #include <map> #include <string> #include <vector> using namespace std; int main(int argc, char* argv[]) { vector<string> stringvector; stringvector.push_back("yannis"); stringvector.push_back("maria"); stringvector.push_back("kostas"); stringvector.push_back("nikos"); stringvector.push_back("anna"); printall(stringvector); sort(stringvector.begin(), stringvector.end()); printall(stringvector); void printall(const vector<string> &sv) { for (int i = 0; i < sv.size(); i++) { cout << sv[i].c_str() << endl; } cout << endl; } map<string, int> positionmap; fillmap(positionmap, stringvector); printposition(positionmap, "Maria"); printposition(positionmap, "Alex"); printposition(positionmap, "Yannis"); } return 0;
Παράδειγμα 1 void fillmap(map<string, int> &themap, const vector<string> &sv) { int i = 0; for (vector<string>::const_iterator it = sv.begin(); it!= sv.end(); it++) { themap.insert(pair<string, int>(*it, i)); i++; } } void printposition(const map<string, int> &themap, string name) { map<string, int>::const_iterator it = themap.find(name); if (it == themap.end()) cerr << name.c_str() << " not found" << endl; else cout << name.c_str() << " is at position " << it->second << endl; }
Παράδειγμα 1
Παράδειγμα 2 #include "stdafx.h" #include <iostream.h> #include <algorithm> #include <list> using namespace std; int main(int argc, char* argv[]) { list<int> numberlist; numberlist.push_back(3); numberlist.push_back(4); numberlist.push_front(2); numberlist.push_front(1); numberlist.push_front(1); for (list<int>::iterator it = numberlist.begin(); it!= numberlist.end(); it++) { cout << *it << " "; } cout << endl;
Παράδειγμα 2 numberlist.unique(); for (list<int>::reverse_iterator rit = numberlist.rbegin(); rit!= numberlist.rend(); rit++) { cout << *rit << " "; } cout << endl << "/////////////////////////////" << endl; do { for (it = numberlist.begin(); it!= numberlist.end(); it++) { cout << *it << " "; } cout << endl; } while(next_permutation(numberlist.begin(), numberlist.end())); } return 0;
Παράδειγμα 2
Παράδειγμα 3 int main(int argc, char* argv[]) { vector<int> set1; vector<int> set2; vector<int> set3(10); vector<int>::iterator startit = set3.begin(); vector<int>::iterator endit; void printall(vector<int>::iterator begin, vector<int>::iterator end) { for (vector<int>::iterator it = begin; it!= end; it++) cout << *it << " "; cout << endl; } for (int i = 0; i < 10; i++) set1.push_back(i); for (i = 0; i < 10; i+=2) set2.push_back(i); endit = set_difference(set1.begin(), set1.end(), set2.begin(), set2.end(), startit); printall(startit, endit); endit = set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), startit); printall(startit, endit); endit = set_union(set1.begin(), set1.end(), set2.begin(), set2.end(), startit); printall(startit, endit); } return 0;
Παράδειγμα 3
Αναφορές MSDN http://en.wikipedia.org/wiki/standard_template_library http://www.mindcracker.com/mindcracker/c_cafe/stl/stlt1.asp http://www.decompile.com/html/tut.html http://dmoz.org/computers/programming/languages/c%2b%2b/class_l
Ερωτήσεις?
Ευχαριστώ