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++ 中创建这样的地图?
您需要映射类型是可以存储字符串或映射的东西。一种方法是使用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 的类,不如尝试为方法找到合理的服务。一般尽量避免二传手。
相关文章:
- C++:用户定义的类,以成员字段作为地址
- 我们可以在套接字编程中将自定义数据作为辅助数据发送吗?
- 使用 Boost::Hana 中的 BOOST_HANA_DEFINE_STRUCT 定义具有 40 个以上字段的结构
- 在类中定义数组的方法和字段
- 将字段(在类中)定义为引用的缺点是什么?
- 通过套接字发送的自定义数据包
- 在 boost::asio 中自定义套接字/关闭系统调用
- 如何在消息文件中获取用户定义的字段
- 使用谷歌协议缓冲区 - 如何在.proto文件中定义字段
- 为什么使用最大位字段序列定义C++内存?
- 使用 boost::geometry::追加时,自定义点类中的 ID 字段间歇性丢失
- 在 C++ 中填充重复的自定义协议缓冲区字段
- 正在取消引用自定义结构字段的迭代器
- 谷歌协议缓冲区,如何设置自定义类型的字段
- 按一个字段对自定义对象向量进行排序
- ID 字段在自定义点类中间歇性丢失
- std::map与字符串键和自定义值字段
- Protobuf:如何在C++中处理嵌套(自定义)可选字段
- 在实例变量中定义字段会使所有实例字段相同
- 应该将SFML RenderWindow继承到自定义渲染类中,还是将其作为字段