2015-06-05 96 views
2

我需要一个std::map容器有类似:有没有办法有一个std ::地图没有声明价值型

[ "a" => [ "a1" => [ "a11" => 1, "a12" => 0 ], "a2" => 1 ] ]

  1. 关键"a1"拥有另一个std::map值,但密钥"a2"具有整数值。在这种情况下,我该如何声明地图?

  2. 有没有办法将值更改为另一种类型?例如,如果我想将"a12"的值更改为std::vector

谢谢。

+1

一些简单的建议,用python和ruby等动态语言来做这件事更容易。静态类型不适用于这个问题。有许多可能的解决方案,但它们都涉及在应用程序代码中嵌入类型,可能不合适。 – ceorron

+0

@ceorron谢谢,是的,在python和ruby中执行此操作要容易得多。实际上,当我试图将python代码转换为C++时,我遇到了这个问题。 –

回答

4

不,你不能马上这样做。考虑使用一些类型擦除设备,最好是类型安全的并且很好理解,如boost::variantboost::any。否则,您可以制作一个value类,其中包含一个不透明的堆分配缓冲区(老派void*),您应该根据enum字段的值将其转换为类型。

+0

谢谢,'boost :: any'适合我。 –

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)); 

这是否解决了您的问题?

0

关键字“a1”具有另一个std :: map的值,但关键字“a2”具有整数值。在这种情况下,我该如何声明地图?

你不能申报这样的地图。地图的所有值都具有相同的类型。

有没有办法将值更改为另一种类型?例如,如果我想将“a12”的值更改为std :: vector?

你大概的意思,“有没有办法来恰克变量的型的另一个”。答案是不。

但是,可以定义一个可以包含任何类型数据的类型。这并不是简单的实现,但你很幸运,Boost已经实现了这样的类型:boost::any。然后,具有这种值类型的地图可以包含在any对象中包含的任何类型的值。我会建议重新考虑你的设计,这样你就不需要拥有任何类型的对象。

0

不,每个STL容器类型都需要确切的ONE类型。对于你的想法,你需要一个可以容纳多种类型的容器类型。为此,您可以使用http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html

1

当使用std :: map时,您需要指定值类型。如果你想映射到不同类型的我想的对象,你有两种可能性:

定义该值的基类,并声明

std::map<int, base_class_t *> 

地图,更好

std::map<int, shared_ptr<base_class_t>> 

然后你可以插入不同的对象,全部来自base_class_t。

outher选项是映射到工会。但我不会这样做;-)

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)); 
} 

所以,你可能隐约使用相同的类与预定义的第一个参数,并在任何你需要的功能定义的第二个。

相关问题