我想知道是否有某种方法可以使用枚举来初始化矢量。枚举是必要的,因为我正在创建一个对象的矢量(相同的类,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 ++语法?
答案 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.