【问题标题】:How do i create struccture of a structure of a structure, ect. nesting multiple structures?我如何创建结构的结构等。嵌套多个结构?
【发布时间】:2019-12-19 17:03:30
【问题描述】:

我在弄清楚我应该如何实现多个结构的嵌套时遇到问题,目标是有仓库,有仓库,有带架子的架子,架子上有物品的地方和它们的 2 位数 ID。现在我的代码看起来像这样:

#include<iostream>
struct place{
    unsigned short place_[65545][2];
};
struct shelf{
    place shelf_[128];
};
struct rack{
    shelf rack_[128];
};
struct warehouse{
    rack warehouse_[128];
    shelf handy_warehouse_shelf_;
};
struct depot{
    warehouse depot_[128];
    rack handy_rack_;
    shelf handy_depot_shelf_;
};
int main(){
    depot name1;
    name1.depot_[0].warehouse_[0].rack_[0].shelf_[0].place_[0][0]=1;
    return 0; 
}

并且无法弄清楚这是否是我理解结构如何工作或我如何访问嵌套数组中的特定“单元格”的问题。

【问题讨论】:

  • 局部变量通常存储在堆栈中,这是有限的;在 Windows 上通常只有一个 MiB,在 Linux 上通常是 8 MiB。现在计算 depot 结构的大小,看看是否可以将所有数据放入堆栈。
  • 虽然我猜我上面的评论是您遇到的问题,但您实际上并没有说出它是什么,甚至没有提出问题。所以请阅读the help pages,阅读the SO tour,阅读how to ask good questionsthis question checklist
  • 在尝试 17 万亿之前,您是否尝试过 两个 嵌套结构?
  • 一个仓库大小为 70.39 TB。
  • 问题不在于代码嵌套结构的方式;没关系。它是结果对象的 size。这是因为 设计 问题。例如,虽然可能有一两个地方可能需要容纳 65545 个项目,但几乎所有的地方少得多。其余的都一样。您需要创建可以调整自身大小以匹配它们所包含的元素数量的对象,而不是对大小进行硬编码。阅读std::vector,它就是为这种情况而设计的。

标签: c++ arrays struct nested


【解决方案1】:

您的仓库正在使用超过 65545 * 2 * 128 * 128 * 128 * 128 * sizeof(unsigned short) 字节的内容作为内存。这对于自动存储的典型实现来说当然太多了(“堆栈”......通常限制在 1 到 8 MB 之间,通常是 AFAIK)。

结构的嵌套是正确的......只是很多。

我建议将设计更改为:

struct Position {
  unsigned warehouse;
  unsigned rack;
  unsigned shelf;
  unsigned place;
  unsigned row;
  unsigned column;
};

struct Depot {
  std::unordered_map<Position, unsigned short> places;
}

上面当然不是一个完整的实现,你还需要考虑如何处理handy_depot_shelf之类的东西,但我希望你能明白。

访问途径

the_depot.places[{0, 0, 0, 0, 0, 0}] = 1;

这当然仅用于演示目的;您应该将其隐藏在成员函数中并执行边界检查等操作。


如果您不能使用std::unordered_map(分配?),那么您需要自己实现替代方案。一个非常简单的开始将是一个链表,每个节点中都有键和值。遍历列表,直到找到具有匹配键的节点,然后返回对值的引用。否则添加具有键和值的新节点,返回对该值的引用。

【讨论】:

  • 我假设std::map 不在iostream 中,这是我唯一被允许使用的东西。是否可以列出结构,在这种情况下是“地点”列表(不一定具有声明的最大大小)?
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2021-09-15
  • 2020-12-12
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
相关资源
最近更新 更多