我需要一个std::map
容器有类似:有没有办法有一个std ::地图没有声明价值型
[ "a" => [ "a1" => [ "a11" => 1, "a12" => 0 ], "a2" => 1 ] ]
关键
"a1"
拥有另一个std::map
值,但密钥"a2"
具有整数值。在这种情况下,我该如何声明地图?有没有办法将值更改为另一种类型?例如,如果我想将
"a12"
的值更改为std::vector
?
谢谢。
我需要一个std::map
容器有类似:有没有办法有一个std ::地图没有声明价值型
[ "a" => [ "a1" => [ "a11" => 1, "a12" => 0 ], "a2" => 1 ] ]
关键"a1"
拥有另一个std::map
值,但密钥"a2"
具有整数值。在这种情况下,我该如何声明地图?
有没有办法将值更改为另一种类型?例如,如果我想将"a12"
的值更改为std::vector
?
谢谢。
不,你不能马上这样做。考虑使用一些类型擦除设备,最好是类型安全的并且很好理解,如boost::variant
或boost::any
。否则,您可以制作一个value
类,其中包含一个不透明的堆分配缓冲区(老派void*
),您应该根据enum
字段的值将其转换为类型。
谢谢,'boost :: any'适合我。 –
我不能完全理解你的问题。我得到的是你想要插入不同类型的值。第一个键将包含该地图另一个键指向的另一个地图的“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));
这是否解决了您的问题?
关键字“a1”具有另一个std :: map的值,但关键字“a2”具有整数值。在这种情况下,我该如何声明地图?
你不能申报这样的地图。地图的所有值都具有相同的类型。
有没有办法将值更改为另一种类型?例如,如果我想将“a12”的值更改为std :: vector?
你大概的意思,“有没有办法来恰克变量的型的另一个”。答案是不。
但是,可以定义一个可以包含任何类型数据的类型。这并不是简单的实现,但你很幸运,Boost已经实现了这样的类型:boost::any
。然后,具有这种值类型的地图可以包含在any
对象中包含的任何类型的值。我会建议重新考虑你的设计,这样你就不需要拥有任何类型的对象。
不,每个STL容器类型都需要确切的ONE类型。对于你的想法,你需要一个可以容纳多种类型的容器类型。为此,您可以使用http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html
当使用std :: map时,您需要指定值类型。如果你想映射到不同类型的我想的对象,你有两种可能性:
定义该值的基类,并声明
std::map<int, base_class_t *>
地图,更好
std::map<int, shared_ptr<base_class_t>>
然后你可以插入不同的对象,全部来自base_class_t。
outher选项是映射到工会。但我不会这样做;-)
我想,可能是一个部分模板类与定义的一个参数可能是你的问题的答案,就像这样;
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));
}
所以,你可能隐约使用相同的类与预定义的第一个参数,并在任何你需要的功能定义的第二个。
一些简单的建议,用python和ruby等动态语言来做这件事更容易。静态类型不适用于这个问题。有许多可能的解决方案,但它们都涉及在应用程序代码中嵌入类型,可能不合适。 – ceorron
@ceorron谢谢,是的,在python和ruby中执行此操作要容易得多。实际上,当我试图将python代码转换为C++时,我遇到了这个问题。 –