【发布时间】:2014-06-25 14:40:49
【问题描述】:
我有一个 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 时手动更改其初始化?
编辑: 感谢您到目前为止所写的所有回复。我正在编辑我的问题,因为我认为我上面的示例误导了一些用户为所提出的实际问题提供答案(实际上,这与我想要为我的应用程序编写的代码略有不同)。
重申我的问题:如何在其上初始化一个数组 当数组的大小为时,用他想要的值声明 由可以在代码开发期间编辑的枚举值确定 无需重新编写初始化?
这意味着:
- 没有使用 for 循环或任何此类方法的回复是有效的,因为我正在谈论在其声明中初始化数组,而不是在代码中进一步。
- 虽然我的初始代码将我的数组作为
static之一,但问题实际上是普遍的,也就是说,与数组是否为static无关。因此,利用数组为static的回复无效。当然,不是static数组会留下一个关于为什么不使用 for 循环或类似于初始化的问题,但在这种情况下,答案应该只做一个“switch case”:“如果你有这样一个阵列,这样做的方式是休耕;如果你有另一种阵列,那么方式就是这个。 - 代码示例附带了一个只有“false”的bool数组,但情况实际上是普遍的,即数组可能只填充“true”甚至“true”和“false”的组合排序通过某种算法,甚至可能根本不是布尔数组,而是 int 或 char 或其他任何东西。
- 我说的是数组,而不是向量或任何 C++ 容器;)
因为我做了这个编辑,我会等到明天得到一个完整的答案,如果没有,我会用你提供的答案做一个。谢谢!
【问题讨论】:
-
[问题最初有一个
static数组。] 在这种情况下,不需要初始化器,因为默认情况下静态bools 将初始化为false。 -
@RichieHindle 哇,这是个好消息 :) 但是如果它不是静态的或者我不想用“false”初始化所有这些,但有些用“false”和其他用“真的”?当然,我可以像 ikegami 建议的那样使用 for 循环,但假设我的好奇心仍然代表在声明中初始化数组(我会改变我的问题,取出那个静态来维护问题)
-
您可能想查看
std::bitset。它允许您轻松设置第 n 位。 (并且还有一个默认初始化程序)。 -
使用
std::fill或std::fill_n。 -
默认初始化是数组
{},然后使用std::fill、std::begin和std::end等算法为您提供最好的安全性,尽管数组发生了变化尺寸。如果您使用std::array,您也可以使用std::array.fill()。最初的问题确实使用了static数组,因此默认的大括号初始化将负责使数组从一开始就处于正常状态。