2011-08-30 13 views
7

me gustaría crear matrices de esta manera:C++ matrices con nombre

string users[1][3]; 

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

pero me sale este error:

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 

¿Es posible crear matrices de este tipo en C++? En PHP, y Javascript son muy básicos, así que estoy un poco sorprendido, ¿cómo puedo hacerlo aquí?

Respuesta

15

La matriz solo puede indexarse ​​por enteros. Si desea indexar por caracteres, necesita std :: map o std :: unordered_map en C++ 11. std :: unordered_map es en realidad una implementación de tabla hash. Por otro lado std :: map es un árbol rojo-negro. Así que elija lo que se ajuste a su necesidad.

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 estructura de datos que está buscando a veces se denomina "matriz asociativa". En C++ se implementa como 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"; 

que no es necesario especificar las dimensiones, como map crecerá cada vez que se inserta un nuevo elemento.

2

No, desafortunadamente esto no es posible con C++. Tienes que usar tipos de mapeo como std::map o algo similar para lograr lo que estás intentando.

Usted podría tratar de usar algo como lo siguiente:

#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

No anime el uso de 'using namespace std;'. http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c –

+0

Muy bien, cambiaré mi respuesta. – Constantinius

+3

No hay nada de malo con el uso de namespace std. De hecho, es lo que hace que los espacios de nombres sean manejables. Hay lugares donde no debe usarlo, por ejemplo, en archivos de encabezado que se incluirán en más de un lugar, pero en el código ordinario no solo es aceptable, sino que es bueno usarlo. – jcoder

2

PHP y Javascript no se escriben con fuerza, en C++ que se quiere crear una estructura que describe el usuario en lugar de depender de cadenas arbitrarias como claves:

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

A continuación, puede crear un índice para hacer referencia a esos usuarios por su nombre (también es posible que desee guardar dicho nombre en el usuario). Los dos contenedores para hacerlo son std::map y std::unordered_map, en general.

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

Nota que almacena en caché la consulta en la matriz mediante la creación de una referencia (y que el objeto se crea de forma automática si no está ya presente).