我需要一个std::map
容器,例如:
[ "a" => [ "a1" => [ "a11" => 1, "a12" => 0 ], "a2" => 1 ] ]
键"a1"
的值为另一个std::map
,但键"a2"
的值为整数。在这种情况下,我该如何申报地图?
有没有办法将值更改为其他类型?例如,如果我想将"a12"
的值更改为std::vector
?
感谢。
答案 0 :(得分:4)
不,你不能马上做到这一点。考虑使用某种类型擦除设备,首选类型安全且易于理解,如boost::variant
或boost::any
。否则,您可以创建一个包含不透明的堆分配缓冲区(旧学校value
)的void*
类,并且您应该根据{{1的值将其强制转换为类型}} field。
答案 1 :(得分:1)
使用std :: map时,需要指定值类型。如果你想映射到不同类型的对象,我认为你有两种可能性:
为值定义基类并声明
std::map<int, base_class_t *>
地图或更好的
std::map<int, shared_ptr<base_class_t>>
然后你可以插入不同的对象,所有对象都是从base_class_t派生的。
外部选项映射到联合。但我不会这样做; - )
答案 2 :(得分:0)
我无法完全理解你的问题。我得到的是你想插入不同类型的值。第一个键将包含该映射的另一个键指向的另一个映射的“int Value”。第二个键将包含一个普通整数。如果是这种情况,为什么不在地图中使用矢量。
std::map<int, std::vector<int>> mymap;
std::vector <int> vec;
vec.push_back(5);
mymap.insert(make_pair(1, vec));
如果您对数据类型不确定,请继续。您也可以使用嵌套地图。对于第二个元素,只需放一个虚拟键。
std::map<int, std::map<int,int>> mymap;
std::map <int, int> mappy;
mappy.insert(make_pair(0,5));
mymap.insert(make_pair(1, mappy));
这会解决您的问题吗?
答案 3 :(得分:0)
键“a1”具有另一个std :: map的值,但键“a2”的值为integer。在这种情况下,我该如何申报地图?
您无法声明此类地图。地图的所有值都具有相同的类型。
有没有办法将值更改为其他类型?例如,如果我想将“a12”的值更改为std :: vector?
你可能意味着,“有没有办法将变量的类型变为另一个变种”。答案是否定的。
但是,可以定义一个可以包含任何类型数据的类型。实现起来并不简单,但是你很幸运,Boost已经实现了这样的类型:boost::any
。然后,具有此类值类型的映射可以包含any
对象中包含的任何类型的值。我建议您重新考虑您的设计,这样您就不需要任何类型的对象了。
答案 4 :(得分:0)
不,每个STL容器类型都需要完全一种类型。根据您的想法,您需要一种可容纳多种类型的容器类型。为此,您可以使用http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html
答案 5 :(得分:0)
我认为,定义一个参数的部分模板类可能是您问题的答案,像这样;
template <typename T>
class partialMap : public std::map<int,T>
{
};
int main()
{
//vector example
std::vector <int> vec;
partialMap<std::vector<int>> _vecMap;
vec.push_back(5);
_vecMap.insert(make_pair(1, vec));
//map example
std::map<int,int> map;
partialMap<std::map<int,int>> _mapMap;
vec.push_back(5);
_mapMap.insert(make_pair(1, map));
}
因此,您可以使用预定义的第一个参数隐藏相同的类,并且无论您需要什么,都可以在函数中定义第二个参数。