This is an old revision of the document!
H Standard Template Libray (STL) είναι βιβλιοθήκη της C++ που αποτελεί αναπόσπαστο τμήμα της stardard βιβλιοθήκης της γλώσσας. Αποτελείται από κλάσεις για προσωρινή αποθήκευση πληροφορίας σε ένα πρόγραμμα που ονομάζονται containers, κλάσεις για διάτρεξη των containers (ονομάζονται iterators) και αλγορίθμους. Οι αλγόριθμοι είναι συναρτήσεις που κατά κανόνα λειτουργούν με την βοήθεια των iterators πάνω στους διαθέσιμους containers.
Βασικό χαρακτηριστικό της STL είναι ότι οι κλάσεις (containers και iterators) και οι συναρτήσεις των αλγορίθμων είναι γενικευμένες, ώστε να μπορούν να εφαρμοστούν με ασφάλεια σε οποιονδήποτε τύπο δεδομένων. Για να το επιτύχουν αυτό, χρησιμοποιούν templates.
Στο παρακάτω διάγραμμα περιέχονται το σύνολο των containers που παρέχει η βιβλιοθήκη STL.
Οι containers της STL διακρίνονται στις εξής κατηγορίες:
Κατά την ένθεση ενός στοιχείου σε ένα container, δημιουργείται πάντοτε ένα αντίγραφο του στοιχείου σε αυτόν. Για παράδειγμα, για την ένθεση στοιχείων της παρακάτω κλάσης Student μέσα σε ένα list τα στοιχεία θα αντιγραφούν εντός του vector ως εξής:
#ifndef _STUDENT_HPP_ #define _STUDENT_HPP_ #include<cstring> #include<iostream> class Student { public: char *name; int aem; public: Student(); Student(const char *name, int aem); Student(const Student& ); ~Student(); friend std::ostream& operator<<(std::ostream& out, const Student & st); bool operator>(const Student& st) const; Student& operator=(const Student& st); }; Student::Student(const char *name, int aem) { this->name = new char [strlen(name) + 1]; strcpy(this->name, name); this->aem = aem; std::cerr << "Argu Construct : " << *this << std::endl; } Student::Student(const Student& st) { name = new char [strlen(st.name) + 1]; strcpy(name, st.name); aem = st.aem; std::cerr << "Copy Construct : " << *this << std::endl; } Student::Student() { this->name = nullptr; this->aem = 0; } Student::~Student() { if(name != nullptr) { std::cerr << "Destruct: " << *this << std::endl; delete []name; } } Student& Student::operator=(const Student& st) { if(name != nullptr) delete name; name = new char [strlen(st.name) + 1]; strcpy(name, st.name); aem = st.aem; std::cerr << "Copy : " << *this << std::endl; return *this; } std::ostream& operator<<(std::ostream& out, const Student& st) { if(st.name != nullptr) out << st.name << " " << st.aem; return out; } bool Student::operator>(const Student& st) const { if(aem > st.aem) return true; return false; } #endif
#include <iostream> // std::cout #include <algorithm> // std::copy #include <list> // std::list #include <array> // std::array #include "Student.hpp" int main () { Student students[] = { Student("Peter_Pan", 1234), Student("Tinker_Bell", 1235), Student("Captain_Hook", 1236), Student("Roger_Rabbit", 1237), Student("Pink_Panther", 1238) }; std::cerr << "----- Init list -----" << std::endl; std::list<Student> mylist; for(int i=0; i<5; i++) { mylist.push_back(students[i]); //mylist.insert(mylist.end(),students[i]); // equivalent with push_back //mylist.emplace_back(students[i].name, students[i].aem); //mylist.emplace(mylist.end(), students[i].name, students[i].aem); // equivalent with emplece_back } std::cerr << "-------------------------\n"; std::cerr << "mylist contains:"; for (std::list<Student>::iterator it = mylist.begin(); it!=mylist.end(); ++it) std::cerr << ' ' << *it; std::cerr << std::endl; std::cerr << "-------------------------\n"; return 0; }
Το παραπάνω πρόγραμμα εκτυπώνει τα εξής:
Argu Construct : Peter_Pan 1234 Argu Construct : Tinker_Bell 1235 Argu Construct : Captain_Hook 1236 Argu Construct : Roger_Rabbit 1237 Argu Construct : Pink_Panther 1238 ----- Init list ----- Copy Construct : Peter_Pan 1234 Copy Construct : Tinker_Bell 1235 Copy Construct : Captain_Hook 1236 Copy Construct : Roger_Rabbit 1237 Copy Construct : Pink_Panther 1238 ------------------------- mylist contains: Peter_Pan 1234 Tinker_Bell 1235 Captain_Hook 1236 Roger_Rabbit 1237 Pink_Panther 1238 ------------------------- Destruct: Peter_Pan 1234 Destruct: Tinker_Bell 1235 Destruct: Captain_Hook 1236 Destruct: Roger_Rabbit 1237 Destruct: Pink_Panther 1238 Destruct: Pink_Panther 1238 Destruct: Roger_Rabbit 1237 Destruct: Captain_Hook 1236 Destruct: Tinker_Bell 1235 Destruct: Peter_Pan 1234
Κατά την εισαγωγή ενός στοιχείου μέσω των συναρτήσεων insert, insert_back, emplace, emplace_back δημιουργείται ένα νέο αντικείμενο μέσω στον container. Η δημιουργία του αντικείμένου γίνεται είτε μέσω του copy-constructor (μέθοδοι insert, insert_back) ή μέσω του κατασκευαστή που λαμβάνει τα ορίσματα που περνιούνται στις μεθόδους emplace και emplace_back.
Όταν στην STL προσδιορίζεται ένα εύρος στοιχείων εντός ενός container μεταξύ των υποτιθέμενων θέσεων start και stop (προσδιορίζονται πάντοτε από iterators) το διάστημα το οποιό υπολογίζεται είναι από start (συμπεριλαμβανομένου) έως και stop (μη συμπεριλαμβανομένου)
Με εξαίρεση την κλάση std::array που το μέγεθος των πινάκων που δημιουργεί είναι σταθερό οι υπόλοιποι containers μπορούν να μεταβάλλουν το αριθμό των στοιχείων που αποθηκεύουν. Για την εισαγωγή ενός στοιχείου σε έναν container υπάρχει η συνάρτηση μέλους insert. Για sequence containers η insert λαμβάνει ως πρώτο όρισμα έναν iterator που δηλώνει τη θέση εισαγωγής