2015-03-13 2 views
3

Как создать std::map с string ключевым и настраиваемым полем значений.std :: map с строковым ключом и полем пользовательских значений

Я хочу std::map, как показано ниже:

"Name" "abcd" 
"age" "50" 
"Address" "Street" "xxxx" 
      "PIN" "xxxx" 
      "District" "xxxx" 
"Gender" "Male" 

Так что мои все мои поля, за исключением третьего являются string,string типа. Но адрес сам по себе является другой картой с партой string string.

Как создать такую ​​карту в C++?

+0

Ваши значения должны быть типа, способного представлять строку или карту из строк в строки. – Hurkyl

+0

Думаю, вы должны моделировать это как класс, а не как карту. – Jens

+0

Вы описываете запись a.k.a 'struct' (или' class'), а не карту. Если вам действительно нужна карта, то вам, вероятно, следует использовать 'std :: map ', используя, например, вариант Boost или Qt. Если вы считаете, что вам нужен amap, вам, вероятно, следует объяснить, почему. Оптимальное решение зависит от причин, по которым вам нужна карта. –

ответ

0

Вам нужно отображенный тип, который может быть как строкой, так и картой. Один из способов будет использовать Boost.Variant:

typedef boost::variant<std::string, std::map<std::string, std::string>> Value; 

typedef std::map<std::string, Value> TheMapYouWouldUse; 

Прочитайте документацию я связан, чтобы узнать, как получить доступ к значениям.

Альтернативой может быть предоставление собственного ограниченного решения. Возможно, что-то вроде этого (несколько Hacky):

class Value 
{ 
    std::map<std::string, std::string> values; 

public: 
    std::string& asString() 
    { return values[""]; } 

    std::map<std::string, std::string>& asMap() 
    { return value; } 
}; 

Интерфейс, конечно, быть настроены в соответствии с вашими реальными потребностями.

0

Это очень просто. Вы можете использовать карту с вектором, где каждый индекс из вашего вектора представляет один элемент.

код не тестировалось только что ввели

std::map<std::string, std::vector<std::string>> items; 
items["Address"].push_back("xxxx") 

Или вы можете использовать карту списка

std::map<std::string, std::list<std::string>> items; 
items["Address"].push_back("xxxx") 

Или вы можете использовать карту карты

std::map<std::string, std::map<std::string, std::string>> items; 
std::map<std::string, std::string> subItems; 
subItems.insert(std::pair<std::string, std::string>("Street", "xxxx"); 
subItems.insert(std::pair<std::string, std::string>("District", "xxxx"); 
items["Address"] = subItems; 
+0

Спасибо за ваш ответ. Если я использую первый метод, где я ставлю значение «Улица» (это фактически ключ для значения «xxxx»). Также по второму методу (карта карты) Как добавить поле Name. Он имеет только одно значение. – user2621310

+0

Первый вариант подразумевает, что Улица является индексом 0, Район будет индексом 1 и так далее. – user743414

+0

@ user2621310 Вы понимаете, что вы перестраиваете «struct» правильно? Я имею в виду, что я видел некоторых упрямых людей, пытающихся повторно реализовать вектор или строку, но struct, это первый. –

0

Вместо карты вы должны создать класс, представляющий объекты вашего лица.

enum class Gender 
{ 
male, 
female 
}; 

class ZipCode 
{ 
// ... 
}; 

class Address 
{ 
    Address(std::string const& s, std::string const& p, std::string const& d): 
    street(s), 
    pin(p), 
    district(d) 
    { 
    } 

private: 
    std::string street; 
    std::string pin; 
    std::string district; 
}; 

class Person 
{ 
public: 
    Person(std::string const& n, Gender d, Address const& a): 
    name(n), 
    gender(g), 
    address(a) 
    { 
    } 

    // now add methods operating on the data. 

private: 
    std::string name; 
    Gender gender; 
    Address address; 
}; 

Вместо того, чтобы создавать класс только с геттерами и сеттерами, попробуйте найти разумные услуги для методов. Старайтесь избегать сеттеров вообще.

+0

Уход за пояснением? Я думаю, что это проблема дизайна, а не проблема языка. – Jens