Mik*_*our 15
std::vector
是最简单的用法; 虽然如你所说,如果你永远不需要调整它,它确实浪费了几个字节.
std::unique_ptr<T[]>
,使用结果初始化new T[size]
,将是最有效的事情; 它应该与指针大小相同,并在销毁时删除已分配的内存.但它不是可复制的; 如果您希望它可以复制,您需要为您的类提供复制构造函数.它也比不太方便std::array
而且std::vector
,因为它没有一个标准集装箱的接口.如果需要,你也可以为它编写一个STL风格的包装器; 但我只是std::vector
在那种情况下使用.
Jas*_*son 11
我不熟悉C++ 11标准,但我认为在执行期间不可能设置模板参数.
您不能将仅在运行时已知的值作为模板参数传递...模板实例化创建的代码必须在编译时创建,因此它不能依赖于运行时值.
一些可能的解决方案是为一些常见的数组大小值创建模板特化,然后创建可能的最大大小值.我认为这将是一种非常低效的工作方式.
老实说,在您的情况下,std::vector
很可能是最好的解决方案,因为您可以resize()
通过动态分配简单地调用向量以使其在运行时具有正确的大小.
std :: array用于在编译时静态地知道大小.如果直到运行时才知道,请使用std :: vector.如果你没有调整它的大小,就没有太大的开销.
class Container
{
vector<T> v;
Container(int i) : v(i) { v.shrink_to_fit(); }
};
Run Code Online (Sandbox Code Playgroud)
如果你担心空间:
http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit
不确定是否有办法构建已经尝试过的矢量.虽然在实践中许多实现都会这样做,但标准似乎并不要求对其进行构建.
BTW您还可以构造一个带向量的向量(size_t N,T t),它将每个初始元素设置为t(没有这个元素是默认构造的).