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