如何使用枚举初始化矢量/数组?

时间:2014-12-17 18:11:00

标签: c++ vector enums

我想知道是否有某种方法可以使用枚举来初始化矢量。枚举是必要的,因为我正在创建一个对象的矢量(相同的类,Chess_piece,但不同的类型)。我希望能够在没有大量测试的情况下访问该元素(if (this is white pawn 8)...)。枚举可以用于以一种很好的方式vec(W_PAWN8)...逐项列出。无论如何,当我创建矢量时,我会做这样的事情(伪代码)

//generate enum of pieces
enum pieceList{
...
} pieceEnum;
vector<int> pieceIter = {W_PAWN1,W_PAWN2,...}; //equal to {1,2,...}
//board index goes from lower left to upper right
vector<int> boardIdx = {8,9,10,11,12,13,14,15,16,1...};
vector<Piece*> pieceVec;
for (int i=0; i<32; i++)
    pieceVec.pushback( new Piece( boardIdx(i), pieceIter(i) ) );

然而,现在我实际上写了两次相同的东西。当我创建枚举和pieceIter时。对于这个程序,我可以忍受它,但我可能不止一次有同样的问题。

这就是为什么我想知道它在c ++中是否存在类似vector<int> pieceIter {pieceEnum};的东西?上一句中的代码片段当然是无效的,但我认为它提示我的问题,使用枚举中的所有变量并以简单的方式初始化向量?

如果没有,是否可以在matlabl中使用某种类型的“范围初始化”,例如:

vector<int> vec {1:32};

但是使用c ++语法?

3 个答案:

答案 0 :(得分:3)

因此,如果你想要generate范围从1到32,你可以使用generate来做到这一点,结合lambda。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> v(32);
    int n=0;
    std::generate(v.begin(), v.end(), [&]{ return ++n; }); 

    //to display the results
    for (auto& it: v){
        cout<<it<<" ";
    }
    return 0;
}

输出: 1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 三十 31 32

希望有所帮助

答案 1 :(得分:1)

解决此问题的一种方法是在枚举中添加一个始终是最后一个值的值。 然后你可以通过循环到值来填充向量。像这样:

enum VALUES{

    VALUES_FIRST = 0,

    VALUES_SECOND,

    VALUES_END
};

std::vector<VALUES> Allvalues;

for(int i = 0; i < VALUES_END; i++){
    Allvalues.push_back(static_cast<VALUES>(i));
}

只要您不在VALUES_END之后放置任何内容,就会在向量中填充枚举中的所有值(不包括最后一个标记值)。

答案 2 :(得分:0)

您也可以使用向量构造函数来初始化向量,如下所示:

enum MyEnum {
  FIRST,
  SECOND,
  THIRD
};

// Example 1:
vector<int> v1(4, MyEnum::FIRST); // init a vector of size 4 to "FIRST".

// Example 2:
vector<MyEnum> v2(4, MyEnum::SECOND); // int a vector of enums.

// Example 3
vector<int> v3 {MyEnum::FIRST, MyEnum::THIRD}; // vector of int of size 2 with different values.

// Example 4:
vector<MyEnum> v4 {MyEnum::FIRST, MyEnum::THIRD}; // vector of enum.