2011-08-30 10 views
7

私はこのような配列を作成したいと思います:C++の名前付き配列

string users[1][3]; 

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

をしかし、私はこのエラーを取得する:

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 

はC++でこのような配列を作成することが可能ですか? PHPやJavascriptでは非常に基本的なので少し驚いていますが、ここでどうすればいいですか?

答えて

15

配列は整数でのみ索引付けできます。文字でインデックスを作成する場合は、std :: mapまたはstd :: unordered_map in C++ 11が必要です。 std :: unordered_mapは実際にはハッシュテーブルの実装です。一方、std :: mapは赤黒の木です。だからあなたの必要に合ったものを選んでください。

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

あなたが探しているデータ構造は、「連想配列」と呼ばれることがあります。 C++では、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"; 

新しい項目が挿入されるたびにmapが成長するようあなたは、寸法を指定する必要はありません。

2

残念ながら、これはC++では不可能です。 std::mapなどのマッピングタイプを使用する必要があります。

あなたはそのように気にいらを使用して試みることができる:

#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

'using namespace std;'の使用を奨励しないでください。 http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c –

+0

申し訳ありません、私は私の答えを変更します。 – Constantinius

+3

名前空間stdの使用には何も問題ありません。実際には、名前空間を管理しやすくしています。ヘッダファイルを複数の場所にインクルードするなど、使用するべきではない場所がありますが、通常のコードでは受け入れられるだけではなく、使用するのが良いこともあります。 – jcoder

2

PHPとJavascriptが強くCには、入力されたされていない++、あなたのユーザーを記述したのではなく、キーとして任意の文字列に頼る構造を作成したいと思う:

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

これらのユーザーを名前で参照するためのインデックスを実際に作成することができます(この名前をユーザーに保存することもできます)。そうするための2つの容器は、一般にstd::mapstd::unordered_mapです。

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

参照を作成することで配列内のルックアップをキャッシュしました(オブジェクトが存在しない場合は自動的に作成されることに注意してください)。

関連する問題