2013-03-06 13 views
10

Sto leggendo la libreria standard C++: un tutorial e un libro di riferimento. In mappa Esempio:Qual è il significato dell'array associativo?

typedef map<string,float> StringFloatMap; 
    StringFloatMap coll; 

    //insert some elements into the collection 
    coll["VAT"] = 0.15; 
    coll["Pi"] = 3.1415; 
    coll["an arbitrary number"] = 4983.223; 
    coll["Null"] = 0; 

L'autore dice:

Qui, l'indice viene utilizzato come chiave e possono avere qualsiasi tipo. Questa è l'interfaccia di un array associativo. Un array associativo è un array in cui l'indice può essere di tipo arbitrario .

Chiunque potrebbe spiegare a me, che cosa arbitraria tipo significa in array associativo?

+2

Significa _any_. Puoi creare una 'std :: map' che usa' int' come chiave, 'std :: string' (come nel tuo esempio), o anche istanze di classi. –

+1

Da [dictionary.com] (http://dictionary.reference.com/browse/arbitrary?s=t) 'arbitrario: non assegnato un valore specifico', in pratica, l'indice può essere qualsiasi cosa; una stringa, un intero, un oggetto ... – jonhopkins

+0

Suppongo/mi aspetto/spero che Josuttis continui a spiegare i requisiti imposti su questo ** tipo "arbitrario" **? –

risposta

7

Gli array sono generalmente indicizzati dalla posizione degli elementi. Un semplice array - int x[10], ha i suoi elementi x[0] ... x[9]. L'indice è un valore integrale senza segno.

Il contenitore associativo indica che l'indice può essere, beh, un tipo arbitrario (non necessariamente un integrale senza segno) (in questo caso, uno std::string).

2

La distinzione è tra vettori/matrici, che molte persone definirebbero container sequenziali, ma che in realtà può essere considerato come contenitori associativi con i tasti essendo una gamma completa di numeri interi da 0 a N.

D'altra parte, le mappe non pongono tale restrizione sulle chiavi, possono essere stringhe, numeri interi, qualsiasi tipo si desideri (a patto ovviamente che ci sia un operatore di confronto di uguaglianza ragionevole su quel tipo).

+0

Beh, non considererei gli array come contenitori associativi indicizzati da interi: 'map [0]' e 'map [1000]' allocano due oggetti, mentre è un comportamento indefinito usare il vettore 'vector [n]' se 'n>. dimensioni() '. – FredericS

+0

La semantica di creazione automatica di map :: operator [] in C++ non ha * nulla * a che fare con la classificazione teorica dei contenitori a mio modesto parere ... – us2012

+0

Il mio punto (che condividi dicendo "intervallo completo") è che tu non posso usare una chiave ** arbitraria ** con un vettore, solo un _sequence_, quindi non la considererò un contenitore associativo. – FredericS

2

Significa che è possibile creare una mappa che corrisponde a un tipo di chiave arbitraria a un tipo di valore arbitrario.

È possibile creare mappe che mappano std::string s per float s, short s per YourClass es o YourOtherClass-YetAnotherClass.

Si potrebbe anche creare un std::map<void *, void *> che potrebbe mappare qualsiasi puntatore a qualsiasi altro puntatore. Anche se questo sarebbe di uso discutibile, perché non ci sarebbe modo di scoprire il tipo di dati a cui punta il puntatore.