繁体   English   中英

C ++ 11 std :: array

[英]C++11 std::array

我想使用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您还可以构造一个带向量的向量(size_t N,T t),它将每个初始元素设置为t(没有这个元素是默认构造的)。

如果在运行时之前不知道数组的大小,那么你想使用std :: vector。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM