如何使用std::map
键和自定义值字段创建string
。
我想要std::map
,如下所示:
"Name" "abcd"
"age" "50"
"Address" "Street" "xxxx"
"PIN" "xxxx"
"District" "xxxx"
"Gender" "Male"
所以我的所有字段除了第三个字段都是string,string
类型。但地址本身就是string string
对的另一张地图。
如何在c ++中创建这样的地图?
答案 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。