2015-03-13 40 views
3

如何使用string键创建std::map键和自定义值字段。std ::带字符串键和自定义值字段的地图

我下面想std::map

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

所以我所有的我,除了第三个领域是string,string类型。但该地址本身是另一张地图,包含string string对。

如何在C++中创建这样的地图?

+0

您的值必须是能够表示从字符串到字符串的字符串或映射的类型。 – Hurkyl 2015-03-13 08:05:45

+0

我认为你应该将这个模型作为一个类而不是地图。 – Jens 2015-03-13 10:03:51

+0

你正在描述一个记录a.k.a一个'struct'(或'class')而不是一张地图。如果你真的需要一个映射,那么你应该使用一个'std :: map ',例如使用来自Boost或Qt的变体。如果你认为你需要一个地图,你应该可以解释为什么。最佳解决方案取决于您需要地图的原因。 – 2015-03-13 12:10:30

回答

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”)的关键。另外第二种方法(地图的地图)我如何添加名称字段。它只有单一的价值。 – user2621310 2015-03-13 09:46:42

+0

选项一意味着街道是索引0,区域将是索引1,依此类推。 – user743414 2015-03-13 10:19:06

+0

@ user2621310你知道你正在重新实现'struct'吗?我的意思是我见过一些固执的人试图重新实现向量或字符串,但结构,这是第一个。 – 2015-03-13 12:14:58

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; 
}; 

不是只用getter和setter创建一个类,而是尝试为方法找到合理的服务。尽量避免二传手。

+0

小心解释downvote?我认为这是一个设计问题,而不是语言问题。 – Jens 2015-03-13 09:53:05