mercoledì 20 marzo 2013

Appunti C++


www.cplusplus.com sito fondamentale per il C++- Guardare in reference soprattutto.
C++ 11 only è il nuovo standard implementato da VS 2010 in poi. Miglioramenti notevoli al linguaggio.
cstdint contiene typedef comodi, chiariscono con il nome la dimensione dei dati in modo esplicito.
Per questi dati è garantita la dimensione che viene mostrata.



Containers
Libreria fatta a template, divisa in una serie di parti.
Ci sono una serie di containers: strutture dati per contenere altri dati (oggetti ecc)
vector->vettore di dati contigui in memoria, cresce in maniera dinamica.
list->adatte per l'inserimento a metà, non bisogna spostare elementi
deque->double ended que, più complessi dei vettori, consente gli inserimenti in testa in maniera efficiente.
array->non è una struttura dati dinamica, ma è statica, si specifica quanto è grande al momento della creazione. Dimensione fissa a tempo di compilazione; ci sono tutti i metodi dei vector, come per vedere la dimensione, gli iteratori ecc.
Guardare da soli: map, set.
set->insieme di elementi, non si accede per indice, dati organizzati in albero binario automaticamente ordinati. Si usano quando bisogna fare una ricerca (che avviene in tempo logaritmico).
map->organizzazione per chiave+contenuto, ricerca in base alla chiave, che può essere un intero o una stringa.

I/O stream library
Feature molto potente, si usa davvero la programmazione a oggetti. Sequenze di dati di qualunque tipo.
Schema con classi e sottoclassi. iostream per fare i/o da tastiera. fstream per gli I/o da file, fstream incapsula i file. sstream i/o su stringhe, sequenze di byte su memoria. Grazie all'ereditarietà si può passare una classe per poi utilizzare le sottoclassi.

Headers miscellanei
Molto potenti, non guardiamo tutto. Usiamo di più:
algorithm (funzioni per i containers), functional, numeric, string (classe che definisce le stringhe, in C non ci
sono, ci sono solo gli array di caratteri, in questo caso si usano molto gli overload degli operatori che permettono una gestione molto semplice delle stringhe. valarray, estensione degli array che vedremo qualche volta.
Nasce per gestire valori numerici.
Unica vera carenza sono le librerie standard per le matrici che non vengono considerate.

Cenni di Codice
I due punti possono inizializzare le variabili SOLO nei COSTRUTTORI.
Per non violare l'incapsulazione bisogna sempre accedere ai dati attraverso i metodi della classe!
2 tipi di ereditarietà: pubblica e privata. Noi usiamo in pratica solo quella pubblica.
Solo i metodi possono essere const, non le funzioni. Il file header viene incluso e compilato 2 volte.
Le interfaccie in c++ non esistono, al massimo esistono le classi astratte.
Non mettere lo using namespace nel file .h, per convenzione forte.
I warning sono errori! Sono da eliminare.
cout nome di un oggetto già pronto da usare -> output per console, su uno stream
costruttore di copia privato per ostream -> un oggetto non può essere copiato. E' vietato copiare uno stream, cosa sensata perchè così non si fa casino con i puntatori-->gli stream vengono sempre passati per reference.
L'operatore << cambia a seconda dello stream ma è il compilatore che lo fa per noi.


Libreria Standard
Libreria standard. Strutture template->container, come ad esempio i vector.
confronto fra size e int da mismatch, il size fa il return del size_type, da warning.
size_t da usare per gli indici, che semplicemente è un unsigned int (diverso se sicompila a 32 o a 64 bit).
Con una lista non usiamo un indice, ma un puntatore all'elemento successivio.
Una delle filosofie alla base della libreria std è fornire un sistema per scorrere tutti i container in modo unificato, in modo tale da non modificare il modo di scorrere gli elementi.
L'idea è usare un'astrazione->dammi il primo elemento, vai all'elemento successivo, è finito il container?
->ITERATORI
Sorta di super puntatore, puntatore intelligente, specifico per ogni tipo di container, usato sempre allo stesso modo. Sono nel namespace di quella classe.
it=v.begin() funzione senza parametri che restituisce l'inizio del vector
it!=v.end() o anche, it<v.end() ma non è molto corretto perchè è solo dei vector.
++it incrementa iteratore. In C++ per motivi di compilazione mettere ++i e non i++ (evita un push inutile).
*it per estrarre contenuto come se fosse un puntatore.
Per comodità spesso si scrive a inizio classe typedef vector<int>::iterator myit_t;
Introdotta la LISTA e le STRINGHE, sono tutti dei container e quindi si può sempre usare l'iteratore.
Il pushback non è di tutti i container, come le set che hanno la funzione insert.
Le liste di inizializzatori possono essere fatti solo sugli array, non è previsto per gli altri container.
Per risolvere il problema si potrebbe utilizzare il costruttore con interatore.
Notare che arr[] non sono classi, ma indirizzi in memoria (semplici elementi del linguaggio). Nei linguaggi
moderni non è previsto in molti casi.
Questo è il modo:
double arr[] = {27.1, 23, 233, 56.6, 4};
cont_t v(arr, arr+sizeof(arr)/sizeof(double));
La sizeof da la dimensione in byte, per avere il numero di elementi dobbiamo dividere per la loro dimensione.
C'è anche la scrittura cont_t v(arr, arr+_countof(arr)); metodo presente nella libreria standard.
FUNCTOR
Oggetto che si comporta come una funzione
Iteratori INSERTERS
Iteratori che quando mettiamo dentro qualcosa, inserisce questo dentro una sequenza.
3 tipi: inseriscono in fondo, in testa, e per i set che supportano inserter.
Riassumendo: guardare le funzioni introdotte dellal ibreria standard (generate, fill, copy, sort) e le loro versioni _n che introducono una piccola variazione. Sono appunto funzioni della libreria std che quindi va importata.
Ce ne sono molte altre, consultare il sito con le references.

Nessun commento:

Posta un commento