std :: map包含字符串键和自定义值字段

时间:2015-03-13 08:02:56

标签: c++ visual-c++ stdmap

如何使用std::map键和自定义值字段创建string

我想要std::map,如下所示:

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

所以我的所有字段除了第三个字段都是string,string类型。但地址本身就是string string对的另一张地图。

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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; }
};

界面当然会根据您的实际需要进行调整。

答案 2 :(得分: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创建类。尽量避免使用setter。