C++中的嵌套字典/数组

7 投票
2 回答
3871 浏览
提问于 2025-04-16 12:52

大家好,
我是一名使用Python和C#的程序员,现在想学习C++。
在Python中,我常常这样做:
myRoutes = {0:[1,2,3], 1:[[1,2],[3,4]], 2:[[1,2,3],[[1,2,3],[1,2,3]],[4]]}

简单来说,当你有长度不一的数组,而又不想浪费一个二维矩阵来存储它们时,把数组嵌套到字典里来管理是个不错的选择。

在C++中,我试过用std::map<int, std:map<int, std:map<int, int> > >,这个方法是可行的,但我觉得应该有更好的方法。

我更倾向于使用标准库,不过像boost这样的流行库我也能接受。

感谢大家的帮助,
Ali

2 个回答

5

看起来这个问题的一部分是:“我该如何在一个容器中存储不同类型的数据?”有几种不同的方法可以做到这一点:

1) 使用现成的数组类型类,这样就不用关心具体的细节(比如维度)。举个例子:Boost 基本线性代数

2) 明确列出元素的类型,可以使用Boost.variant

   #import "boost/variant.hpp"

   typedef boost::variant< ArrayTypeA, ArrayTypeB > mapelement;
   typedef std::map<int, mapelement> mappingtype;

variant类型构建一个访问者有点复杂(这需要写一个boost::static_visitor<desired_return_type>的子类,并为每种类型重载一个operator())。好的一面是,访问者会进行静态类型检查,以确保它们实现了正确的处理程序。

3) 使用一个包装类型,比如Boost.Any来包装不同类型的数据。


总体来说,我觉得第一种选择(使用专门的数组类)可能是最可靠的。我最近的代码中也大量使用了variants,虽然编译错误信息很长,但一旦习惯了这些,编译时检查是很棒的,我更喜欢这种方式,而不是Python那种“运行后再发现你错了”的方式。

2

很多人都能理解你现在遇到的困难,但其实是有解决办法的。其中一个办法就是使用Boost库(可以把它看作是C++的第二个标准库)。这个库里有很多集合类的工具。在你的情况下,我建议使用Boost::多维数组

它的样子是这样的:

boost::multi_array<double,3> myArray(boost::extents[2][2][2]);

这个代码创建了一个2x2x2的数组。模板参数中的第一个类型“double”表示这个数组里存放的数据类型,第二个“3”表示数组的维度数量。接着,你可以用“extents”来设置每个维度的实际大小。使用起来非常简单,而且语法也很清晰。

现在,如果你在Python中处理类似于foo = {0:[1,2,3], 1:[3,4,5]}这样的东西,其实你需要的是multimap。这个工具是标准库的一部分,基本上是一个红黑树,按键索引,但值是一个列表。

撰写回答