用C ++初始化一个大小不固定的数组

时间:2014-06-25 14:40:50

标签: c++ arrays enums

我有一个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循环或类似于初始化的问题,但在这种情况下答案应该只做一个"切换情况" :"如果你有这样一个数组,这样做的方法是休息;如果你有另一种阵列,那么另一种方式是#34;。
  • 代码示例附带一个bool数组,只有" false",但情况实际上是通用的,也就是说,数组可能只填充" true"甚至是" true"的组合和"假"按一些算法排序,甚至可能不是一个布尔数组,但是一个int或一个char或其他什么。
  • 我在谈论数组,而不是向量或任何C ++容器;)

由于我做了这些编辑,我会等到明天才能得到一个完整的答案,如果没有,我会用你提供的答案做一个。谢谢!

6 个答案:

答案 0 :(得分:4)

通过指定空的brace-init列表

可以很容易
void myMethod()
{    
    static bool myArray[MyEnumCount] = {};
    //...
}

在这种情况下,数组的所有元素都将初始化为false。由于数组是静态的,您甚至可能不指定初始化程序。它将由编译器本身进行零初始化。

考虑到您可以使用std::array

例如

void myMethod()
{    
    static array<bool, MyEnumCount> myArray = {};
    //...
}

在这种情况下,您可以使用brace-init列表重新分配数组。

答案 1 :(得分:2)

你所拥有的代码(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;
}

答案 2 :(得分:2)

如果要将所有内容初始化为false,请使用空列表:

bool myArray[MyEnumCount] = {};

如果您想将所有内容初始化为其他内容,请使用std::fillstd::fill_n

bool myArray[MyEnumCount];
std::fill_n(myArray, MyEnumCount, true);
// or std::fill(myArray, myArray + MyEnumCount, true);

答案 3 :(得分:1)

如果它不是静止的,

bool myArray[MyEnumCount];
for (int i=MyEnumCount; i--; )
   myArray[i] = false;

答案 4 :(得分:1)

使用没有指定足够值的初始化程序是可以的,其余值将采用该类型的默认值:

enum MyEnum
{
    Item1,
    Item2,
    Item3,

    MyEnumCount
};

//In .cpp
void myMethod()
{    
    bool myArray[MyEnumCount] = {false, true};  // The third will be false
    //...
}

答案 5 :(得分:1)

你必须使用数组吗?或者你可以使用标准容器吗?例如,使用向量可以很容易地完成:

static std::vector<bool> myArray(false, MyEnumCount);

但是这可能是静态数组的一些问题。您需要确保在初始化数组时已经定义了变量MyEnumCount。在您的情况下,因为静态数组在函数内部,您只需确保在计数定义之后调用它,这可能是。