首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11 std::数组

C++11 std::数组
EN

Stack Overflow用户
提问于 2012-01-31 22:34:52
回答 4查看 9.2K关注 0票数 12

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-31 22:39:26

std::vector是最容易使用的;尽管如您所说,如果您永远不需要调整它的大小,那么它确实会浪费几个字节。

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

票数 15
EN

Stack Overflow用户

发布于 2012-01-31 22:39:26

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

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

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

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

票数 11
EN

Stack Overflow用户

发布于 2012-01-31 22:39:03

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

代码语言:javascript
复制
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

不确定是否有一种方法来构造已经修剪的向量。标准似乎并不要求对其进行构造修剪,尽管在实践中许多实现都会这样做。

顺便说一句,你还可以用向量(size_t N,T t)构造一个向量,它会将每个初始元素设置为t(如果没有这个元素,元素就是默认构造的)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9081288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档