有没有办法让std :: map没有声明值类型

时间:2015-06-05 09:58:18

标签: c++ c++11

我需要一个std::map容器,例如:

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

  1. "a1"的值为另一个std::map,但键"a2"的值为整数。在这种情况下,我该如何申报地图?

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

  3. 感谢。

6 个答案:

答案 0 :(得分:4)

不,你不能马上做到这一点。考虑使用某种类型擦除设备,首选类型安全且易于理解,如boost::variantboost::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));
}

因此,您可以使用预定义的第一个参数隐藏相同的类,并且无论您需要什么,都可以在函数中定义第二个参数。