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&lt;desired_return_type&gt; 的子类,并为您的变体中的每种类型编写一个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&lt;int, int&gt; 建模,它具有为你处理极端情况的好属性,或者更直接的翻译 map&lt;int, list&lt;int&gt; &gt;,它没有t. multimap 允许重复键。 Python 数组没有。所以我看不出它是如何解决这里的问题的。主要问题是数组的“值”类型会有所不同,因此他需要某种变体,尽管它们始终是某个维度的数组。

以上是关于C ++中的嵌套字典/数组的主要内容,如果未能解决你的问题,请参考以下文章

如何访问字典数组并使用Objective C中的字典对象?

如何将嵌套字典转换为 3D 数组

获取嵌套数组/对象的数组中的所有唯一值(删除重复项)

带有 C#Driver 的 MongoDB:如何过滤嵌套对象数组中的字段

嵌套数组内的Mongodb增量值

swift实现遍历嵌套字典并修改其中的值