有没有一种方法可以在不声明值类型的情况下拥有std::map ?

Is there a way to have a std::map without declare the value type

本文关键字:类型 情况下 std map 声明 拥有 一种 方法 有没有      更新时间:2023-10-16

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

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

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

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

谢谢。

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

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

为值定义基类并声明

std::map<int, base_class_t *>

映射或,最好是

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

然后你可以插入不同的对象,都是从base_class_t派生的。

另一个选项是映射到联合。但我不会那样做;-)

我没有完全理解你的问题。我得到的是你想要插入不同类型的值。第一个键将包含另一个映射的"int值",该映射的另一个键指向该映射。第二个键将包含一个普通整数。如果是这种情况,为什么不在map中使用vector呢?

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

这解决你的问题了吗?

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

键"a1"的值为另一个std::map,但键"a2"的值为整型。在这种情况下,我如何声明地图?

你不能声明这样的映射。map的所有值具有相同的类型。

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

你的意思可能是,"有没有办法将变量的类型更改为另一种类型"。答案是否定的

但是,可以定义一个可以将任何类型的数据包含在其中的类型。实现起来并不简单,但是您很幸运,Boost已经实现了这样的类型:boost::any。具有这种值类型的map可以保存any -object中包含的任何类型的值。我建议你重新考虑你的设计,这样你就不需要任何类型的对象了。

我认为,可能一个部分模板类与一个参数定义可能是你的问题的答案,像这样;

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

因此,您可以使用模糊的相同类,第一个参数预定义,第二个参数在函数中定义,无论您需要什么

相关文章: