【问题标题】:Grid class with STL container of unkownsize (cant use vector)带有未知大小的 STL 容器的网格类(不能使用矢量)
【发布时间】:2020-07-09 20:44:56
【问题描述】:

我需要创建一个网格类,它使用一个 STL 容器来存储单元格(预定义的枚举),用于生命游戏应用程序。本质上,头文件需要类似于:

class Grid {
private:
    std::array<Cell, N> grid_array;
public:
    Grid(const unsigned int width, const unsigned int height);
}

其中数组的长度(N)在构造函数中设置为width*height。

代码必须遵守一个规范,在该规范中经常使用 STL 容器,但强烈暗示不应使用 std::vector

我曾考虑使用指向std::array 的指针,但读到由于不同大小的std::arrays 是根本不同的类型,因此不可能实现指针。有什么解决方案可以让std::array 起作用吗?

【问题讨论】:

  • 为什么不能使用std::vectorstd::array 只是一个模板,std::array&lt;T,n&gt;std::array&lt;T,m&gt; 是不同的类型(对于 m != n),因此指针不会有帮助
  • 你能参数化grid的大小吗?即使它成为template &lt;size_t N&gt; class grid;
  • 似乎很清楚您应该使用类似std::map&lt;std::pair&lt;int,int&gt;, Cell&gt; 的东西来实现稀疏矩阵。
  • 这是作业的一部分,我的讲师在其中指出,由于效率低下,不应使用std::vector,而应使用一维数组。是的,我认为模板可以使用,template &lt;size_t N&gt; 将如何与数组一起使用?

标签: c++ arrays stl conways-game-of-life stdarray


【解决方案1】:

有什么解决方案可以使用 std::array 吗?

不可以,除非网格的大小在编译时已知,并且您可以将其作为模板参数。

我会使用std::vector。另一种选择是std::unique_ptr&lt;Cell[]&gt;,它需要做更多的工作(如果您希望Grid 可复制,则必须提供自定义复制构造函数和赋值运算符)。

【讨论】:

  • 这是作业的一部分,我的讲师在其中指出我们不应使用std::vector,而应使用一维数组创建解决方案。
  • @JoshP97 也许重点是不要使用嵌套向量 (std::vector&lt;std::vector&lt;Cell&gt;&gt;)?这是有道理的,因为它确实效率低下。那么一维向量(std::vector&lt;Cell&gt;,大小为w*h)可能是允许的,并且是最佳选择。
猜你喜欢
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多