如何用随机大小初始化std::array?现有宏无法实现该需求
为什么无法用随机值初始化std::array?
嘿,我来帮你搞清楚这个问题的核心原因,以及对应的解决方案~
首先先回顾下你目前能正常工作的两种std::array初始化方式:
- 基于已有数组的编译期确定长度:
#define length(array) sizeof(array)/sizeof(array[0]) int data[] = {2, 3, 34, 10, 3, 12, 30 }; const int arr_length = length(data); std::array<int,arr_length> data_std_array;
- 直接用编译期常量指定长度:
const int arr_length = 500; std::array<int,arr_length> data_std_array;
问题的核心原因
你尝试用randRange生成的随机值来指定std::array的长度时会失败,比如类似这样的代码:
#define randRange(x,y) x + ( std::rand() % ( y - x + 1 ) ) float a = randRange(2, 200); const int arr_length = static_cast<int>(a); // 这行代码会触发编译错误! std::array<int,arr_length> data_std_array;
这是因为**std::array的大小是模板参数,必须是编译期常量表达式**——简单来说,这个长度值在程序编译阶段就得完全确定,而std::rand()是运行时才会生成随机值的函数,编译器在编译时根本无法预知它的返回结果,自然没办法提前确定std::array需要分配的内存大小,所以会直接报错。
实用的解决方案
如果你的需求是创建一个长度由运行时随机值决定的容器,std::vector是更合适的选择——它的大小是运行时动态分配的,完美支持用随机值指定长度:
#include <vector> #include <cstdlib> #define randRange(x,y) x + ( std::rand() % ( y - x + 1 ) ) int main() { // 生成运行时随机长度 int arr_length = randRange(2, 200); // 用随机长度初始化vector std::vector<int> data_vector(arr_length); // 后续可以像array一样使用,比如赋值、遍历 for(int i = 0; i < data_vector.size(); ++i) { data_vector[i] = randRange(1, 100); } return 0; }
如果确实需要编译期的“随机”长度(这种场景比较少见,比如编译时生成固定的随机容器大小),可以用C++11及以后的constexpr结合编译期随机算法,但这种方式复杂度较高,日常开发用std::vector就完全能满足需求啦。
内容的提问来源于stack exchange,提问作者Hartun
相关产品推荐
相关产品推荐

