2013-02-07 95 views
0

我对C++来说很新,所以我很抱歉如果对此的回答很明显。基础std :: array的正确类型

我一直在编写一个STL风格的自定义数据结构,以此来提高我的技能。 (实际上我对这个结构也有实际的需求,但是我为了学习的目的而有点过分。)

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

我想过声明一个成员对每个潜在规模,像

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

,但我不希望每个这些阵列默认构造T成员的。

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

感谢您的帮助。

编辑:在重新阅读我的问题

后,我不认为这是有道理的,其实。我知道std :: array的大小在编译时必须知道,但由于某种原因,我的大脑推断我的目标是不可能的。现在看来很明显我坚持使用C风格的数组和堆。我想我只需要写出来清楚一点。

感谢您的回答。

+0

如果你的结构像一个向量并且需要动态调整大小,为什么不使用向量作为底层结构,并在其上添加额外的功能? 'std :: array'是为了提供一个容器,它在编译时*已知大小,并不能为vector实现提供良好的基础。 – us2012

+0

只需坚持动态,手动管理阵列。他们需要在某个层次上处理,而这个层次是'std :: vector'。如果你重新实现'std :: vector',那么你必须自己处理它们。 –

回答

5

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

只需使用std::vector代替,它有一个constructor,它将大小作为它的参数。

+0

我知道它会遭到怀疑,但实际上有很好的理由挤出这种结构的很多表现。我已经写了一个C风格的数组底层,所以如果我不能使用std :: array,我会保持原样。 – piyo

+1

@piyo:你的结构比'std :: vector'更高效吗?如果是这样,你应该分享它。 –

+0

@piyo:好吧,'矢量'肯定不会比阵列快*,但我认为你会很难测量任何性能差异。 – Jon

1

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

+0

对。我明白了。但是C风格的数组并不意味着可以调整大小,但将它们用作容器的基础类型仍然有意义,否? – piyo

+0

@piyo如果您使用'new []',那么它不使用C风格的数组,尽管其语法类似。 – ecatmur

+0

@piyo:不,非常不那样。事实上,你绝对不应该在C++中使用动态C风格的数组(即'new []')。分离内存和对象的生命周期要好得多(例如使用分配器),就像'std :: vector'那样。由于您的数据结构已经需要存储容器的大小,因此没有必要让原始数组单独跟踪这些信息。 –

1

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

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