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

std::map with string key and custom value field

本文关键字:自定义 字段 字符串 map std      更新时间:2023-10-16

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

我想要如下std::map

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

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

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

您需要映射类型是可以存储字符串或映射的东西。一种方法是使用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; }
};

当然,界面将进行调整以满足您的实际需求。

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

代码未测试只是键入

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;

您应该创建一个表示 Person 对象的类,而不是映射。

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 的类,不如尝试为方法找到合理的服务。一般尽量避免二传手。