2011-08-30 26 views
7

Adlandırılan Diziler:C++ Böyle diziler oluşturmak istiyorum

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 

o C++ bu gibi diziler oluşturmak mümkün mü:

string users[1][3]; 

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

Ama bu hatayı alıyorum? PHP ve Javascript'te çok basitler, bu yüzden biraz şaşırdım, nasıl yapabilirim?

cevap

15

Dizi yalnızca tamsayılarla dizine eklenebilir. Chars ile dizine eklemek istiyorsanız, C++ 11'da std :: map veya std :: unordered_map gerekir. std :: unordered_map aslında bir karma tablosu uygulamasıdır. Öte yandan std :: map kırmızı-siyah ağaçtır. Yani ihtiyacınıza uygun olanı seçin.

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

Aradığınız veri yapısı bazen "ilişkisel dizi" olarak adlandırılır. C++ 'da std::map olarak uygulanır. Yeni bir öğe takıldığında bir map büyüyecek olarak

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

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

Sen boyutlarını belirtmek gerekmez.

2

Hayır, maalesef bu C++ ile mümkün değil. std::map gibi eşleme türlerini veya denediğiniz şeyi elde etmek için benzer bir şey kullanmalısınız.

Böyle somthing kullanarak deneyebilirsiniz:

#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

Lütfen 'namespace std;' kullanarak kullanımını teşvik etmeyin. http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c –

+0

Tamam, cevabımı değiştireceğim. – Constantinius

+3

namespace std kullanımıyla ilgili bir sorun yok. Aslında isim alanlarını yönetilebilir yapan şeydir. Kullanmamanız gereken yerler vardır, örneğin başlık dosyalarında birden fazla yere eklenecek, ancak sıradan kodda sadece kabul edilebilir değil, aynı zamanda kullanmak için iyi bir şey. – jcoder

2

PHP ve JavaScript şiddetle C, daktilo değildir ++ Eğer kullanıcı açıklayan ziyade tuşları olarak keyfi dizeleri güvenerek bir yapı oluşturmak isteyeyim:

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

Daha sonra, bu kullanıcılara ada göre referans vermek için bir indeks oluşturabilirsiniz (ayrıca, adı kullanıcı adına saklamak isteyebilirsiniz). Bunu yapmak için iki kap, genel olarak std::map ve std::unordered_map'dur. Bir referans oluşturarak (ve mevcut olmaması halinde nesnenin otomatik olarak oluşturulur) dizideki look-up önbelleğe

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

not edin.

İlgili konular