C++11标准::数组

C++11 std::array

本文关键字:数组 标准 C++11      更新时间:2023-10-16

我想使用C++11中的std::array作为我自己类的字段。它采用两个模板参数(第一个定义数据类型,第二个定义数组大小)。

但我只知道构造函数中的第二个参数。我不熟悉C++11标准,但我认为在执行过程中不可能设置模板参数。

std::array的替代品吗?std::vector可能有点太多了,因为我永远不会改变它的大小。

std::vector是最简单的使用方法;尽管正如你所说,如果你永远不需要调整它的大小,它确实会浪费几个字节

使用new T[size]的结果初始化的std::unique_ptr<T[]>将是最有效的东西;它应该与指针大小相同,并且在销毁时会为您删除分配的内存。不过,它是不可复制的;如果您希望类是可复制的,则需要为它提供一个复制构造函数。它也不如std::arraystd::vector方便,因为它没有标准容器的接口。如果你需要的话,你也许可以为它编写一个STL风格的包装器;但在这种情况下,我只会使用std::vector

我不熟悉C++11标准,但我认为在执行过程中不可能设置模板参数。

不能将仅在运行时已知的值作为模板参数传递。。。模板实例化创建的代码必须在编译时创建,因此它不能依赖于运行时值。

一些可能的解决方案是为一些常见的数组大小值创建模板专用化,然后创建一个可能的最大大小值。我认为这是一种效率很低的工作方式。

老实说,在您的情况下,std::vector很可能是最好的解决方案,因为您可以简单地在向量上调用resize(),通过动态分配使其在运行时具有正确的大小。

std::array用于在编译时静态知道大小的情况。如果直到运行时才知道,请使用std::vector。如果你不调整它的大小,就不会有太多的开销。

class Container
{
    vector<T> v;
    Container(int i) : v(i) { v.shrink_to_fit(); }
};

如果你担心空间:

http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit

不确定是否有方法构建已经三聚的载体。标准似乎并不要求它被构造为三聚体,尽管在实践中许多实现都会这样做。

BTW您还可以使用vector(size_t N,t t)构造一个向量,该向量将把每个初始元素设置为t(如果没有此选项,则默认构造元素)。

如果直到运行时才知道数组的大小,那么您需要使用std::vector。