C++ 从数组中指定对象值的向量? 类块 { 私人: int XPO; int yPos; }; 矢量块; int stoneBlockXpos[]={1,2,3,4,5,6}; int stoneBlockYpos[]={1,2,3,4,5,6};

C++ 从数组中指定对象值的向量? 类块 { 私人: int XPO; int yPos; }; 矢量块; int stoneBlockXpos[]={1,2,3,4,5,6}; int stoneBlockYpos[]={1,2,3,4,5,6};,c++,arrays,object,C++,Arrays,Object,基本上,我想做的是将数组的值分配给xPos和yPos。最简单的方法是什么?我在几个if()语句中使用了这些数组,它们几乎就是我正在制作的游戏的关卡数据的x和y坐标 我能想到的唯一可行的解决方案是在每个if()语句中放置一个for()循环,然后以这种方式分配值。但是,这不是很有效 是的,如果有必要知道的话,这一切都将以相同的方式发生。我正在我制作的“地图创建器”中创建这些数组。这是另一回事。编写creator中所做的事情的唯一方法是以数组的格式(x和y各一个)将矢量号打印到文本文档中,并将它们粘贴

基本上,我想做的是将数组的值分配给
xPos
yPos
。最简单的方法是什么?我在几个
if()
语句中使用了这些数组,它们几乎就是我正在制作的游戏的关卡数据的x和y坐标

我能想到的唯一可行的解决方案是在每个
if()
语句中放置一个
for()
循环,然后以这种方式分配值。但是,这不是很有效

是的,如果有必要知道的话,这一切都将以相同的方式发生。我正在我制作的“地图创建器”中创建这些数组。这是另一回事。编写creator中所做的事情的唯一方法是以数组的格式(x和y各一个)将矢量号打印到文本文档中,并将它们粘贴到游戏项目的代码中


谢谢!:)

如果您只想初始化向量一次(并且您有一个与C++11兼容的编译器),可以使用以下类型的方法:

class block
{
     private:
          int xPos;
          int yPos;
};

 vector<block> stoneBlocks;

 int stoneBlockXpos[] = {1, 2, 3, 4, 5, 6};
 int stoneBlockYpos[] = {1, 2, 3, 4, 5, 6};
#包括
#包括
使用名称空间std;
类块
{
公众:
块(intx,inty):xPos(x),yPos(y){
私人:
int XPO;
int yPos;
};
int main()
{
静态向量stoneBlocks1{{1,1},{2,2},{3,3};
静态向量stoneBlocks2{{5,6},{7,8},{9,10};
... 
}

假设您的
有一个取两个
int
s的构造函数,您可以这样做:

#include <vector>
#include <initializer_list>

using namespace std;

class block
{
public:
    block(int x, int y) : xPos(x), yPos(y) {}
private:
    int xPos;
    int yPos;
};


int main()
{
  static vector<block> stoneBlocks1 { {1, 1}, {2, 2}, {3, 3} };
  static vector<block> stoneBlocks2 { {5, 6}, {7, 8}, {9, 10} };

  ... 
}
(C++03也可以这样做,但它需要一些辅助函数)

假设您需要经常这样做,您可以创建一个小包装器,它执行相同的操作,但也确保两个数组的大小都正确,例如:

std::transform(std::begin(stoneBlockXpos), std::end(stoneBlockXpos),
               std::begin(stoneBlockYpos),
               std::back_inserter(stoneBlocks),
               [](int x, int y) { return block(x, y); });
模板
向量
生成块(int(&xpos)[Size],int(&ypos)[Size])
{
std::向量rc;
std::transform(std::begin(xpos),std::end(xpos),
标准::开始(ypos),
标准:背面插入器(rc),
[](intx,inty){返回块(x,y);};
返回rc;
}
stoneBlocks=制造块(stoneBlockXpos、stoneBlockYpos);

当你想加载关卡时,是否不可能将关卡数据写入外部文件,然后将其读入游戏?如果你想在向量中使用它们,为什么要将它们存储在数组中?为什么要使用向量?你是在玩关卡时修改石头块吗?@NeilKirk我在自己制作的程序中生成了数字。我认为最简单的方法是以数组的形式打印它,然后将它粘贴到游戏的代码中,然后以某种方式将数组的值分配给游戏中的向量。这是原始文本。你能把这些数据放在代码之外的某个更高级别的数据存储中吗?你不是指
std::transform(std::begin(stoneBlockXpos),std::end(stoneBlockXpos),
在您的第一个示例中?
转换
非常有用。不,对不起。我在main的开头创建向量,并在整个游戏中传递它们不断修改它们。@Tobiasundell如果If语句中的数组从未更改(原始起始数据),为什么不改成静态向量?@NeilKirk你能告诉我怎么做/是什么吗?:)我对向量很陌生。我只编程了一年。
static const vector stoneBlocks{{1,1},{2,2},{3,3}
类似于
static const int stoneBlockXpos[]={1,2,3,4,5,6};静态常数int stoneBlockYpos[]={1,2,3,4,5,6}@TobiasSundell:我已经添加了一个示例,说明了如何做到这一点。
template <int Size>
std::vector<block>
makeBlocks(int (&xpos)[Size], int (&ypos)[Size])
{
    std::vector<block> rc;
    std::transform(std::begin(xpos), std::end(xpos),
                   std::begin(ypos),
                   std::back_inserter(rc),
                   [](int x, int y) { return block(x, y); });
    return rc;
}

stoneBlocks = makeBlocks(stoneBlockXpos, stoneBlockYpos);