c++ - 在这种情况下可以使用 std::array(或 boost::array),还是我坚持使用 std::vector 和 native 数组?

标签 c++ arrays boost vector stl

因此 std::array 和 boost::array(它们几乎相同,我在下文中将含糊地称为“数组”)旨在为数组提供一个容器对象,而不会招致 vector 的开销如果数组不动态更改大小,则不需要。但是,它们都是通过将数组大小作为模板参数而不是构造函数参数来设计的。结果:vector 允许在创建对象后动态调整大小;数组需要在编译时知道大小。

据我所知,如果您有一个数组,您将在对象创建时知道其大小但在编译时不知道,那么您唯一的选择是 1) 使用 vector 不必要地产生额外开销,2) 使用(非容器类型)原生数组(例如,int foo[42];),或 3)从头开始编写您自己的数组包装类。那么这是正确的吗,这是一种介于两者之间的情况,您可能想使用数组而不是 vector ,但不能吗?或者有什么我可以做的魔术可能对我有用吗?

这里有一些细节(好吧,很多)是什么激发了这个问题,以防它帮助你理解:

我有一个模块——比如调用者——会在运行时重复生成二进制数据(unsigned char[],或数组),然后将它传递给另一个模块——比如被调用者。被调用者模块不修改数组(它会复制并在必要时修改),所以一旦调用者模块最初创建数组,它就不会改变大小(也不会改变内容)。但是,会出现两个问题: 1) 调用者可能不会在每次生成数组时生成相同大小的数组——它会在创建数组时在运行时知道数组大小,但在编译时不知道。 2) 调用者将数组传递给被调用者的方法需要能够接受调用者传递给它的任何大小的数组。

我想过让它成为一个模板化的函数,例如,

template<size_t N> void foo(const array<unsigned char, N>& my_array);

但是,我正在使用接口(interface)类将接口(interface)与被调用方模块中的实现分开。因此,函数必须是虚方法,这与被模板化是互斥的。此外,即使这不是问题,它仍然会遇到与上面 #1 相同的问题 - 如果在编译时不知道数组大小,那么它也无法在编译时解析模板化函数。

我的实际功能:

virtual void foo(const array<unsigned char, N>& my_array); // but what is N???

总而言之,我是否正确地认为我唯一真正的选择是使用 vector 或 native 数组,例如,

virtual void foo(const vector<unsigned char> my_array); // unnecessary overhead
virtual void foo(const unsigned char[] my_array, size_t my_array_len); // yuk

或者是否有一些我忽略的技巧可以让我使用 std::array 或 boost::array?

最佳答案

在 C++11 中有 std::dynarray 之前,您可以使用 std::unique_ptr:

std::unique_ptr<Foo[]> arr(new Foo[100]);

您可以将其用作arr[0]arr[1] 等,它会调用正确的delete[] 销毁后。开销很小(只是指针)。

我认为数组类型的唯一指针与 std::dynarray 之间的唯一区别是后者具有迭代器和 size 其他“容器”属性,并且它将位于“容器”部分而不是“通用工具”部分。 [更新:编译器可能会选择原生支持 dynarray 并优化它以使用堆栈存储。]

关于c++ - 在这种情况下可以使用 std::array(或 boost::array),还是我坚持使用 std::vector 和 native 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17560031/

相关文章:

c++ - VS2015 没有链接 user32.lib

java - 按长度过滤数组元素

PYTHON - 查找数组中每 10 个整数的最大值

c++ - std::lower_bound 跳过无效元素

java - 无法在消费者线程中使用 JNI 的生产者消费者程序中捕获 SIGINT 信号

c++ - 试试 {} catch(){} C++

c++ - 如何验证用户将字符串输入到 std::cin 中?

c++ - 新的运算符分配函数顺序连续性和初始值

javascript - 如何在 JavaScript 中使用 .map() 的数组和参数按顺序更新对象数组?

boost - 新版本的 BJam 是否支持向后兼容旧版本的 Boost?