基础std::数组的正确类型

Proper type for underlying std::array

本文关键字:类型 数组 std 基础      更新时间:2023-10-16

我对C++还很陌生,所以如果答案很明显,我很抱歉。

我一直在写一个STL风格的自定义数据结构,以此来提高我的技能。(事实上,我对这种结构也有实际的需求,但出于研究目的,我有点过头了。)

这个结构需要动态调整大小(就像向量一样),在我的第一稿中,我将底层的"容器"制作成了一个C风格的数组,并手动执行所有的分配和取消分配。我正在重构,我想使用C++11风格的std::数组作为我的底层结构,只是为了让代码更干净一点。我的问题是,我不知道如何以允许调整大小的方式声明数组类成员。由于不同的模板参数需要不同的类型,所以我不能只将成员声明为数组,然后在调整大小时将相同的变量分配给数组。

我考虑过为每个潜在规模宣布一个成员,比如

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

但我不希望这些数组中的每一个都默认构造t成员。

这里有干净的解决方案吗?还是我必须坚持使用C风格的数组?

谢谢你的帮助。

编辑:

重读了我的问题之后,我觉得其实没有什么意义。我知道std::数组的大小必须在编译时知道,但由于某种原因,我的大脑推断我的目标是不可能的。对我来说,现在很明显,我被C风格的数组和堆所困扰。我想我只需要把它写出来就可以了。

谢谢你的回答。

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

只需使用std::vector,它就有一个以大小为参数的构造函数。

std::array是专门设计为不可调整大小的。它主要是解决固定大小数组不是一流值类型这一事实的一种变通方法。

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

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