C++中的嵌套字典/数组
大家好,
我是一名使用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 个回答
看起来这个问题的一部分是:“我该如何在一个容器中存储不同类型的数据?”有几种不同的方法可以做到这一点:
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那种“运行后再发现你错了”的方式。
很多人都能理解你现在遇到的困难,但其实是有解决办法的。其中一个办法就是使用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。这个工具是标准库的一部分,基本上是一个红黑树,按键索引,但值是一个列表。