2011-08-30 8 views
7

vorrei creare array come questo:C++ Array Named

string users[1][3]; 

users["CIRK"]["age"] = "20"; 
users["CIRK"]["country"] = "USA"; 
users["CIRK"]["city"] = "New York"; 

ma ottengo questo errore:

index.cpp: In function 'int main()': 
index.cpp:34: error: invalid types 'std::string [1][3][const char [5]]' for array subscript 
index.cpp:35: error: invalid types 'std::string [1][3][const char [5]]' for array subscript 
index.cpp:36: error: invalid types 'std::string [1][3][const char [5]]' for array subscript 

E 'possibile creare array come questi in C++? In PHP e Javascript sono molto semplici quindi sono un po 'sorpreso, come posso farlo qui?

risposta

15

L'array può essere indicizzato solo da numeri interi. Se si desidera indicizzare per caratteri, è necessario std :: map o std :: unordered_map in C++ 11. std :: unordered_map è in realtà un'implementazione della tabella hash. D'altra parte std :: map è un albero rosso-nero. Quindi scegli quello che si adatta alle tue esigenze.

std::unordered_map<std::string, std::unordered_map<std::string, std::string>> users; 

users["CIRK"]["age"] = "20"; 
users["CIRK"]["country"] = "USA"; 
users["CIRK"]["city"] = "New York"; 
17

La struttura di dati che si sta cercando viene talvolta definita "array associativo". In C++ è implementato come std::map.

std::map<std::string, std::map<std::string, std::string> > users; 

users["CIRK"]["age"] = "20"; 
users["CIRK"]["country"] = "USA"; 
users["CIRK"]["city"] = "New York"; 

che non è necessario per specificare le dimensioni, come un map crescerà ogni volta che viene inserito un nuovo elemento.

2

No, sfortunatamente questo non è possibile con C++. Devi usare tipi di mappatura come std::map o qualcosa di simile per ottenere ciò che stai provando.

Si potrebbe provare a utilizzare somthing così:

#include <map> 
#include <string> 

... 
std::map<std::string, map<std::string, std::string> > mymap; 
users["CIRK"]["age"] = "20"; 
users["CIRK"]["country"] = "USA"; 
users["CIRK"]["city"] = "New York"; 
+0

Si prega di non incoraggiare l'uso di 'using namespace std;'. http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c –

+0

Bene, cambierò la mia risposta. – Constantinius

+3

Non c'è niente di sbagliato nell'usare lo spazio dei nomi std. È in effetti ciò che rende gli spazi dei nomi gestibili. Ci sono luoghi in cui non dovresti usarlo, per esempio nei file di intestazione da includere in più di un posto, ma nel codice ordinario non è solo accettabile, ma è una buona cosa usarlo. – jcoder

2

PHP e Javascript non sono fortemente tipizzati, in C++ si vorrebbe creare una struttura che descrive l'utente, piuttosto che basarsi su stringhe arbitrarie come chiavi:

struct User { 
    size_t _age; 
    std::string _city; 
    std::string _country; 
}; 

Quindi, è possibile creare un indice per fare riferimento a tali utenti in base al nome (è possibile che si desideri memorizzare tale nome nell'utente). I due contenitori per farlo sono std::map e std::unordered_map, in generale.

std::map<std::string, User> users; 
User& user = users["CIRK"]; 
user._age = 20; 
user._country = "USA"; 
user._city = "New York"; 

nota che il caching delle look-up nell'array creando un riferimento (e che l'oggetto si crea automaticamente se non già presente).