C++ 11 std :: array

Dej*_*jwi 12 c++ arrays vector stdvector c++11

我想使用std::arrayC++ 11作为我自己班级的一个领域.它需要两个模板参数(第一个定义数据类型,第二个定义数组的大小).

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

还有其他选择std::array吗?std::vector可能有点太多了,因为我永远不会改变它的大小.

Mik*_*our 15

std::vector是最简单的用法; 虽然如你所说,如果你永远不需要调整它,它确实浪费了几个字节.

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

  • 我想说在unique_ptr <T []>上使用std :: vector,前者与所有在迭代器上工作的标准库函数兼容.事实上,std :: array的重点是在普通数组上提供这样的接口. (3认同)
  • @ user1131467:确实,`std :: vector`更方便; 但OP确实表达了对效率的担忧,因此节省几个字节也很重要. (3认同)

Jas*_*son 11

我不熟悉C++ 11标准,但我认为在执行期间不可能设置模板参数.

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

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

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

  • @phresnel:或`reserve` +一系列`push_back` /`emplace_back`如果不是你的所有项目都应该是相同的. (2认同)

And*_*zos 6

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(没有这个元素是默认构造的).