[英]Initialize an array in C++ whose size is not fixed
我有一个C ++应用程序,我想使用在其声明中初始化的数组。 但是,问题在于,项目数量不是以“常规”方式固定的,而是基于枚举内的“计数器”数字的:
//"Normal way"
void myMethod()
{
bool myArray[3] = { false, false, false };
//...
}
//My way
//In .hpp
enum MyEnum
{
Item1,
Item2,
...,
MyEnumCount
}
//In .cpp
void myMethod()
{
bool myArray[MyEnumCount] = { false, false, false };
//...
}
开发时可能发生的一种情况是,通过增加或减少项目数量来更改MyEnum
定义。 想法是,如果发生这种情况,代码将自动适应新的枚举,而无需手动查看特定版本的代码部分。 有没有办法在该数组初始化中执行此操作? 还是在这种特定情况下,我总是必须在更改MyEnum时手动更改其初始化?
编辑:谢谢到目前为止写的所有答复。 我正在编辑问题,因为我认为上面的示例误导了一些用户,无法为所提出的实际问题提供答案(实际上,这与我想要给我的应用程序的代码稍有不同)。
重申我的问题:当数组的大小由枚举值确定时,如何用其想要的值初始化数组,而该枚举值可以在代码开发期间进行编辑而不必重写初始化?
这意味着:
static
数组,但问题实际上是通用的,也就是说,与数组是否static
无关。 因此,没有利用数组为static
回复是有效的。 当然,不是static
数组会引发一个问题,即为什么不使用for循环或类似于初始化,但是在这种情况下,答案应该仅是“切换情况”:“如果您有这样的数组,这样做的方法是休闲的;如果您有另一种数组,那么方法是另一种”。 自进行此修改以来,我要等到明天才能得到完整的答案,如果没有,我将用您提供的答案来做一个。 谢谢!
指定空的括号初始化列表很容易
void myMethod()
{
static bool myArray[MyEnumCount] = {};
//...
}
在这种情况下,数组的所有元素都将初始化为false
。 由于数组是静态的,因此您甚至可以不指定初始化程序。 它将由编译器本身初始化为零。
考虑到您可以使用std::array
:
例如
void myMethod()
{
static array<bool, MyEnumCount> myArray = {};
//...
}
在这种情况下,您可以使用brace-init列表重新分配阵列。
您那里的代码(带有MyEnumCount
)将可以正常工作,因为MyEnumCount
在编译时是恒定的。
关于初始化,您可以使用一些选项。
static bool myArray[MyEnumCount] = {};
或者(如果值更复杂
static bool myArray[MyEnumCount];
// some place safe...
for (auto it = std::begin(myArray); it != std::end(myArray), ++it) {
*it = false;
}
如果要将所有内容初始化为false,请使用一个空列表:
bool myArray[MyEnumCount] = {};
如果要将所有内容初始化为其他内容,请使用std::fill
或std::fill_n
:
bool myArray[MyEnumCount];
std::fill_n(myArray, MyEnumCount, true);
// or std::fill(myArray, myArray + MyEnumCount, true);
如果不是静态的
bool myArray[MyEnumCount];
for (int i=MyEnumCount; i--; )
myArray[i] = false;
可以使用未指定足够多的值的初始化程序,其余值将采用该类型的默认值:
enum MyEnum
{
Item1,
Item2,
Item3,
MyEnumCount
};
//In .cpp
void myMethod()
{
bool myArray[MyEnumCount] = {false, true}; // The third will be false
//...
}
您必须使用数组吗? 还是可以使用标准容器? 例如,使用向量可以很容易地做到这一点:
static std::vector<bool> myArray(false, MyEnumCount);
但是将其作为静态数组可能会出现一些问题。 您需要确保在初始化数组时已定义变量MyEnumCount
。 在您的情况下,由于静态数组位于函数内部,因此您只需要确保在定义计数(可能是计数)之后调用它即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.