从数组中分配对象值的向量?

时间:2013-08-24 22:41:47

标签: c++ arrays object

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};

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

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

是的,如果需要知道的话,这一切都会以同样的方式发生。我正在我制作的“地图创建者”中创建这些数组。这是一个单独的事情。在创建者中编写完成内容的唯一方法是将数据以数组的形式打印到文本文档中(x和y各一个)并将其粘贴到游戏项目的代码中。

谢谢! :)

2 个答案:

答案 0 :(得分:1)

如果你只想初始化向量ONCE(并且你有一个C ++ 11兼容的编译器),你可以使用这种方法:

#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} };

  ... 
}

答案 1 :(得分:1)

假设你的block有一个构造函数需要两个int,你可以这样做:

std::transform(std::begin(stoneBlockXpos), std::end(stoneBlockXpos),
               std::begin(stoneBlockYpos),
               std::back_inserter(stoneBlocks),
               [](int x, int y) { return block(x, y); });

(与C ++ 03相同,但需要一些辅助功能)。

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

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);
相关问题