我想在我的类中使用C++11的std::array
作为一个字段。它有两个模板参数(第一个定义数据类型,第二个定义数组的大小)。
但是我只能在构造函数中知道第二个参数。我不熟悉C++11标准,但我猜想在执行过程中无法设置模板参数。
是否有任何替代方法可以替换std::array
?std::vector
可能有点过于复杂,因为我永远不会改变它的大小。
std::vector
是最简单易用的;虽然如你所说,如果你永远不需要调整大小,它会浪费一些字节。
std::unique_ptr<T[]>
使用new T[size]
的结果进行初始化,将是最有效的;它应该与指针的大小相同,并且在销毁时会为您删除分配的内存。但是,它不可复制;如果您想要它可复制,您需要为您的类提供一个复制构造函数。它也不像std::array
和std::vector
那样方便,因为它没有标准容器的接口。如果您需要,您可以为其编写STL风格的包装器;但在这种情况下,我只会使用std::vector
。
我不熟悉C++11标准,但我认为在执行期间设置模板参数是不可能的。
无法将仅在运行时已知的值作为模板参数传递...由模板实例化创建的代码必须在编译时创建,因此它不能依赖于运行时值。
一些可能的解决方案是为一些常见的数组大小值创建模板特化,然后为可能的最大大小值。 我认为这将是一种相当低效的工作方式。
老实说,在您的情况下,std::vector
很可能是最好的解决方案,因为您可以通过动态分配在运行时调用 resize()
来使其成为正确的大小。
std::vector (size_t n)
构造函数,而不是resize()
。 - Sebastian Machreserve
+一系列push_back
/emplace_back
。 - Matthieu M.std::array是在编译时就知道大小的静态数组。如果你直到运行时才知道大小,请使用std::vector。如果您不要调整大小,则几乎没有开销。
class Container
{
vector<T> v;
Container(int i) : v(i) { v.shrink_to_fit(); }
};
std::vector
的代码产生的向量化SSE代码与本机数组相同(至少在g++中)。 - Sebastian Mach如果你在运行时不知道数组的大小,那么你需要使用std::vector。
std::vector
更加方便;但是OP确实表达了对效率的担忧,因此也许节省一些字节很重要。 - Mike Seymour