appunti3s:stl
Differences
This shows you the differences between two versions of the page.
— | appunti3s:stl [2020/06/08 22:20] (current) – created - external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Standard Template Library ====== | ||
+ | ===== Premessa ===== | ||
+ | |||
+ | La libreria standard del linguggio C++ (ISO) contiene numerosi header file, tra cui: < | ||
+ | |||
+ | I seguenti appartengono alla **Standard Template Library**, cioè sono dedicati alla dichiarazione di [[appunti3s: | ||
+ | < | ||
+ | |||
+ | I seguenti permettono di usare funzioni del C++ in C: < | ||
+ | |||
+ | I seugenti permettono di usare funzioni del C in C++: < | ||
+ | |||
+ | >> A parte il caso degli operatori //new// e //delete//, ogni altro operatore si trova nel namespace //std// | ||
+ | |||
+ | ===== STL ===== | ||
+ | |||
+ | La Standard Template Library contiene: | ||
+ | * container: generici contenitori per dati (60 tipi di container) | ||
+ | * algorithm: operazioni sui dati (10 tipi di algoritmi) | ||
+ | * sequence: sequenze che iniziano con un iteratore e terminano con un iteratore (che è oltre la fine) | ||
+ | * iterator: ogni tipo di container ha il proprio tipo di iterator | ||
+ | |||
+ | iteratore= serve per accedere indirettamente (per puntare) ad un elemento di una sequenza | ||
+ | |||
+ | ==== Container ==== | ||
+ | |||
+ | Tipi di dato generici (template) e astratti, non è necessario sapere come sono fatti realmente | ||
+ | |||
+ | Esempi: vector, lista, coda, stringa, mappa, albero... | ||
+ | * Sequence containers: vector, list, deque | ||
+ | * Associative containers: map, set, multimap, multiset | ||
+ | * " | ||
+ | ==== Algorithm ==== | ||
+ | Le operazioni accedono ai dati tramite gli iterator. | ||
+ | Ad esempio, esistono funzioni utili a trovare elementi per posizione, per contenuto, per proprietà | ||
+ | * funzioni di inserimento, | ||
+ | * funzioni di ordinamento, | ||
+ | * funzioni comuni, pronte all' | ||
+ | * funzioni standard che si possono applicare su diversi tipi di dato (parametrizzate) | ||
+ | |||
+ | ==== Sequence ==== | ||
+ | |||
+ | Rappresentare graficamente una sequenza e una seq. vuota. con gli iteratori come frecce. | ||
+ | |||
+ | ==== Iterator ==== | ||
+ | |||
+ | Su un oggetto iterator è sempre possibile eseguire almeno queste tre operazioni: | ||
+ | * ++ incremento | ||
+ | * * deferenziazione (leggere il contenuto) | ||
+ | * == confronto sul contenuto | ||
+ | |||
+ | ===== Esempio ===== | ||
+ | Operazioni molto comuni nell' | ||
+ | - verificare la fine di una struttura dati | ||
+ | - leggere un elemento di una struttura dati | ||
+ | - passare all' | ||
+ | |||
+ | Anticipando qualche concetto sulla struttura // | ||
+ | < | ||
+ | std:: | ||
+ | std:: | ||
+ | |||
+ | - < | ||
+ | - < | ||
+ | - < | ||
+ | |||
+ | |||
+ | ===== vector ===== | ||
+ | Per usarli si deve includere | ||
+ | < | ||
+ | Si può presentare la struttura di un //vector// facendo alcuni esempi: | ||
+ | |||
+ | * esempio che crea la struttura e la inizializza correttamente | ||
+ | * < | ||
+ | * esempio che __copia__ l' | ||
+ | * < | ||
+ | * esempio che copia in fondo l' | ||
+ | * < | ||
+ | |||
+ | * La funzione push_back() permette di inserire una __copia__ di un elemento in fondo al vector senza preoccuparsi di quale sia la sua posizione. | ||
+ | * Per rimuovere un elemento a partire dal fondo si usa la funzione pop_back(). | ||
+ | <file c vector1.cpp> | ||
+ | // inserire alcuni voti in un vector: | ||
+ | #include < | ||
+ | int main() | ||
+ | { | ||
+ | std:: | ||
+ | std::cout << " | ||
+ | double temp=-1.0; | ||
+ | while (temp) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | // ... aggiungere eventuale elaborazione dei voti ... | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | * Non è necessario specificarne la dimensione nella dichiarazione | ||
+ | * Sono allocati in modo dinamico, ma non se ne deve preoccupare direttamente il programmatore | ||
+ | * I dati sono allocati in modo continuo | ||
+ | * L' | ||
+ | |||
+ | Un //vector// può contenere qualsiasi tipo di oggetti, ad esempio //string//: | ||
+ | |||
+ | <file c vector2.cpp> | ||
+ | // inserire alcuni voti in un vector: | ||
+ | #include < | ||
+ | #include < | ||
+ | int main() | ||
+ | { | ||
+ | std:: | ||
+ | std::cout << " | ||
+ | std::string temp=" "; | ||
+ | while (temp!="" | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | // ... aggiungere eventuale elaborazione ... | ||
+ | } | ||
+ | </ | ||
+ | ====Accesso agli elementi==== | ||
+ | Gli elementi del vector sono indicizzati con un numero che parte da ZERO. | ||
+ | In precedenza si è visto come si può inserire una copia dell' | ||
+ | Per la lettura, invece, si può accedere agli elementi di un vector in due modalità: | ||
+ | * usando il tipo // | ||
+ | * usando il tipo // | ||
+ | ===iterator=== | ||
+ | Si è già parlato del concetto di iterator come puntatore. Nel seguente esempio vengono prima inseriti dei voti e poi visualizzati. Invece di iterator si usa il tipo const_iterator che consente l' | ||
+ | |||
+ | <file c vector3.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | float voto; | ||
+ | std:: | ||
+ | std::cout << " | ||
+ | for (int i=0; i<10; i++) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | for (std:: | ||
+ | | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | ===size_type=== | ||
+ | Esistono due usi dei size_type per accedere agli elementi di un vector: | ||
+ | * accesso controllato | ||
+ | * accesso non controllato | ||
+ | L' | ||
+ | L' | ||
+ | < | ||
+ | std:: | ||
+ | std::cout << v1.at(i); | ||
+ | std::cout << v1[i]; | ||
+ | </ | ||
+ | Esempio in cui vengono prima inseriti e poi visualizzati dei voti | ||
+ | <file c vector4.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | float voto; | ||
+ | std:: | ||
+ | std::cout << " | ||
+ | for (int i=0; i<10; i++) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | for (int i=0; i<10; i++) // | ||
+ | | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Lo stesso esempio si può ripetere sostituendo l' | ||
+ | < | ||
+ | con l' | ||
+ | < | ||
+ | ===== Altre funzioni ===== | ||
+ | Altre funzioni (inserimento/ | ||
+ | Queste ultime alterano quasi sempre la posizione del resto degli elementi del container e quindi alterano anche gli iterator, eccetto che nel caso delle liste... | ||
+ | < | ||
+ | v1.erase(p1); | ||
+ | v1.insert(p1, | ||
+ | </ | ||
+ | |||
+ | Un' | ||
+ | < | ||
+ | p1 = find(v.begin(), | ||
+ | </ | ||
+ | === Cenni agli oggetti funzione (function objects)=== | ||
+ | header < | ||
+ | < | ||
+ | p1 = find_if(v1.begin(), | ||
+ | p1 = find_if(v1.begin(), | ||
+ | </ | ||
+ | Sono stati utilizzati negli ultimi due esempi e sono molto usate nella LTS | ||
+ | * permettono di emulare la programmazione funzionale in C++ | ||
+ | * permettono di scrivere codice semplice ed efficiente | ||
+ | * permettono di scrivere codice che sarebbe impossibile scrivere in modo tradizionale | ||
+ | |||
+ | |||
appunti3s/stl.txt · Last modified: 2020/06/08 22:20 by 127.0.0.1