底层std :: array的正确类型

时间:2013-02-07 16:33:56

标签: c++ arrays data-structures c++11 std

我对C ++很陌生,所以如果答案显而易见,我会道歉。

我一直在编写STL风格的自定义数据结构,以此来提高我的技能。 (我实际上也确实需要这种结构,但是为了研究目的,我会有点过分。)

这个结构需要动态调整大小(像向量),在我的初稿中,我使底层的“容器”成为C风格的数组,并手动完成所有的分配和解除分配。我正在重构,我想使用C ++ 11风格的std :: array作为我的底层结构,只是为了让代码更清晰一些。我的问题是我不知道如何以允许调整大小的方式声明数组类成员。由于不同的模板参数需要不同的类型,我不能只将一个成员声明为数组,然后在调整大小时将相同的变量赋值给数组。

我想为每个可能的大小声明一个成员,比如

private:
    array<T, 8>
    array<T, 16>
    array<T, 32>
    ...

但我不希望每个数组都默认构造T成员。

这里有干净的解决方案吗?或者我只需要坚持使用C风格的数组?

感谢您的帮助。

编辑:

重新阅读我的问题之后,我认为实际上并不合理。我知道std :: array的大小必须在编译时知道,但出于某种原因我的大脑推断我的目标是不可能的。现在我觉得很明显,我坚持使用C风格的数组和堆。我想我只需要写出来就可以清楚地表达出来。

感谢您的回答。

3 个答案:

答案 0 :(得分:5)

std::array表示一个数组,其大小是静态已知的(即在编译时),因此不能用于此类大小仅在运行时已知的情况。

简单地使用std::vector代替它,它有一个constructor,它将大小作为参数。

答案 1 :(得分:1)

std::array专门设计为不可调整大小。这主要是一个解决方法,因为固定大小的数组不是一流的值类型。

答案 2 :(得分:1)

我能想到的唯一用例是某种外化或序列化对象(存储在磁盘上或通过套接字传递,或沿着这些行传递的东西),其中有一个动态大小的组件。如果您已经为此定义了格式,那么您应该坚持使用所拥有的格式。如果在编译时不知道大小,那么尝试重用std::array<>将不起作用。

如果你想重构,可能有用的是一个模板类,可以将C数组作为构造函数参数,但为它提供一个STL容器接口。