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

Ali*_*Ali 6 c++ python arrays dictionary nested

大家好,我是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这样的流行库也适合我.


阿里,我感谢你的帮助

pho*_*oji 5

看起来问题的一部分是:'我如何在容器中存储异构数据?' 有几种不同的方法:

1)使用现成的数组类型来抽象出确切的细节(即维度).示例:提升基本线性代数

2)使用,制作明确的元素类型列表Boost.variant

   #import "boost/variant.hpp"

   typedef boost::variant< ArrayTypeA, ArrayTypeB > mapelement;
   typedef std::map<int, mapelement> mappingtype;
Run Code Online (Sandbox Code Playgroud)

variant类型构建访问者有点涉及(它涉及为变体中的每个类型编写一个boost::static_visitor<desired_return_type>具有单个operator()重载的子类).从好的方面来说,访问者是静态类型检查,以确保他们实现了正确的处理程序集.

3)使用包装类型,比如Boost.Any包装不同类型的兴趣.


总的来说,我认为第一个选项(使用专门的数组类)可能是最可靠的.我variants在最近的代码中也大量使用了,虽然编译错误很长,但是一旦习惯了这些错误,编译时检查就好了,我更喜欢Python的"运行并发现你以后错了"范例.


whe*_*ies 2

我们中的许多人都和您一样正在经历痛苦,但有解决方案。这些解决方案之一是 Boost 库(它就像 C++ 的第二个标准库)。有相当多的集合库。在你的情况下,我会使用Boost::Multi-Dimentional Arrays

看起来像这样:

boost::multi_array<double,3> myArray(boost::extents[2][2][2]);
Run Code Online (Sandbox Code Playgroud)

这会创建一个 2x2x2 数组。模板参数中的第一个类型“double”指定数组将保存的类型,第二个“3”指定数组的维数。然后,您可以使用“范围”来传递每个维度的实际大小。非常易于使用,并且其意图在语法上很清晰。

现在,如果您正在处理 Python 中的某些内容,例如foo = {0:[1,2,3], 1:[3,4,5]}您真正需要的是multimap。这是标准库的一部分,本质上是一个红黑树,按键索引,但有一个值列表。