C ++中的嵌套字典/数组
Posted
技术标签:
【中文标题】C ++中的嵌套字典/数组【英文标题】:Nested Dictionary/Array in C++ 【发布时间】:2011-07-07 17:11:02 【问题描述】:各位,
我是一个 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 这样的流行库。
感谢您的帮助, 阿里
【问题讨论】:
祝你好运,将这种东西硬塞到 STL 数据结构中。你能做的最好的可能是std::map<int, std::list<int>>
或类似的具有固定数量的级别,而不是任意深度的数据结构,如在 Python 中。并不是说做不到,只是不简单。
@Chinmay,那么当您需要数组字典时,您在 C++ 中使用什么数据结构?
数组字典没问题。 std::map<int, std::list<int>>
或 std::map<int, std::vector<int>>
可以很好地完成这项工作。问题是 your 数组可以容纳更多的数组,以此类推。正如@Phooji 所说,Boost::Any 或 Boost::Variant 可能会满足您的需求。
请记住,Python 是用 C 语言编写的,因此编写允许这样做的代码是非常可能的,但在做之前我会考虑很久。大多数时候,想要/需要这种代码是因为没有完全转变为用新语言思考。我敢打赌,您仍在尝试用 C++ 编写 Python 代码,恕我直言,这项努力注定要失败。
【参考方案1】:
问题的一部分似乎是:“如何将异构数据存储在容器中?”有几种不同的方法:
1) 使用现成的数组类型类,抽象出确切的细节(即维度)。示例:Boost Basic Linear Algebra
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::Multi-Dimentional Arrays。
看起来像这样:
boost::multi_array<double,3> myArray(boost::extents[2][2][2]);
这会创建一个 2x2x2 数组。模板参数中的第一个类型“double”指定数组将保存的类型,第二个“3”指定数组的维数。然后,您使用“范围”来赋予每个维度的实际大小。非常易于使用且语法清晰。
现在,如果您在 Python 中处理 foo = 0:[1,2,3], 1:[3,4,5]
之类的问题,那么您真正需要的是 multimap。这是标准库的一部分,本质上是一棵红黑树,按键索引,但值有一个列表。
【讨论】:
我认为您答案的foo = 0:[1,2,3], 1:[3,4,5]
部分需要更多解释。你的意思是(我认为)它可以在 C++ 中使用 multimap<int, int>
建模,它具有为你处理极端情况的好属性,或者更直接的翻译 map<int, list<int> >
,它没有t.
multimap 允许重复键。 Python 数组没有。所以我看不出它是如何解决这里的问题的。主要问题是数组的“值”类型会有所不同,因此他需要某种变体,尽管它们始终是某个维度的数组。以上是关于C ++中的嵌套字典/数组的主要内容,如果未能解决你的问题,请参考以下文章