std::map 带有字符串键和自定义值字段

std::map with string key and custom value field

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

我想要一个 std::map 如下:

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

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

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

很简单。 您可以使用带有矢量的地图,其中矢量中的每个索引代表一个项目。

刚刚输入的代码未经测试

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;

您需要映射类型是可以存储字符串或映射的类型。一种方法是使用 Boost.Variant:

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

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

阅读我链接的文档以了解如何访问这些值。

另一种方法是提供您自己的受限解决方案。也许是这样的(有点老套):

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

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

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

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

您应该创建一个 class 代表您的人物对象而不是地图。

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 的 class,不如尝试为方法找到合理的服务。一般尽量避免设置器。