C++ Named Arrays
I would like to create arrays like this:
string users[1][3];
users["CIR开发者_如何学GoK"]["age"] = "20";
users["CIRK"]["country"] = "USA";
users["CIRK"]["city"] = "New York";
But I get this 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
Is it possible to create arrays like these in C++? In PHP, and Javascript they are very basic so I'm a bit surprised , how can I do it here?
Array can only indexed by integers. If you want to index by chars, you need std::map or std::unordered_map in C++11. std::unordered_map is actually a hash table implementation. On the other hand std::map is red-black tree. So choose whatever fits your need.
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";
The data structure you are looking for is sometimes called an "associative array". In C++ it is implemented as 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";
You don't need to specify the dimensions, as a map
will grow whenever a new item is inserted.
PHP and Javascript are not strongly typed, in C++ you would want to create a structure describing your user rather than relying on arbitrary strings as keys:
struct User {
size_t _age;
std::string _city;
std::string _country;
};
Then, you can indeed create an index to reference those users by name (you may also want to store the said name in the user). The two containers to do so are std::map
and std::unordered_map
, in general.
std::map<std::string, User> users;
User& user = users["CIRK"];
user._age = 20;
user._country = "USA";
user._city = "New York";
Note that I cached the look-up in the array by creating a reference (and that the object is automatically created if not already present).
No, unfortunately this is not possible with C++. You have to use mapping types like std::map
or something similar to achieve what you are trying.
You could try using something like that:
#include <map>
#include <string>
...
std::map<std::string, std::map<std::string, std::string> > users;
users["CIRK"]["age"] = "20";
users["CIRK"]["country"] = "USA";
users["CIRK"]["city"] = "New York";
精彩评论