gpt4 book ai didi

c++ - 在 C++ 中,如果大小必须在编译时确定,那么 std::array 的意义何在?

转载 作者:行者123 更新时间:2023-12-04 22:39:04 25 4
gpt4 key购买 nike

原谅我的无知,在我看来 std::array旨在成为常规阵列的 STL 替代品。但是因为数组大小必须作为模板参数传递,它会阻止我们创建 std::array只有在运行时才知道的大小。

std::array<char,3> nums {1,2,3}; // Works.

constexpr size_t size = 3;
std::array<char,size> nums {1,2,3}; // Works.

const buf_size = GetSize();
std::array<char, buf_size> nums; // Doesn't work.

我假设 C++ 中数组的一个非常重要的用例是基于运行时输入创建一个固定大小的数据结构(比如为读取文件分配缓冲区)。

我为此使用的解决方法是:
// Create a array pointer for on-the-spot usecases like reading from a file.
char *data = new char[size];
...
delete[] data;

或者:
// Use unique_ptr as a class member and I don't want to manage the memory myself.
std::unique_ptr<char[]> myarr_ = std::unique_ptr<char[]>(new char[size]);

如果我不关心固定大小,我知道我可以使用 std::vector<char>大小预定义如下:
std::vector<char> my_buf (buf_size);
std::array 的设计者为什么选择忽略这个用例?也许我不了解 std::array 的真正用例.

编辑:我想另一种表达我的问题的方式也可能是 - 为什么设计师选择将尺寸作为模板参数而不是作为构造函数参数传递?选择后者会使提供 std::array 的功能变得困难。目前有?对我来说,这似乎是一个深思熟虑的设计选择,我不明白为什么。

最佳答案

易于编程std::array促进了 std::vector 中使用的几个有益的接口(interface)和习语.对于普通的 C 样式数组,不能有 .size() (没有 sizeof 黑客),.at() (超出范围除外),front()/back() ,迭代器,等等。一切都必须手工编码。
很多程序员可能会选择std::vector即使对于编译时已知大小的数组,也只是因为他们想利用上述编程方法。但这夺走了编译时固定大小数组的可用性能。
因此std::array由库制造商提供以阻止 C 风格的数组,但要避免 std::vector s 当大小在编译时已知时。

关于c++ - 在 C++ 中,如果大小必须在编译时确定,那么 std::array 的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60235741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com