访问多维向量指针向量中的元素

时间:2016-11-16 22:40:49

标签: c++ pointers vector

我正在编写一个程序,允许输入类似俄罗斯方块的形状。我将这些形状存储在布尔的二维矢量中,以便它们看起来像:

110   |   1   |   111
011   |   1   |   010
      |   1   |   111
// Where a 0 denotes "empty space"

然后我指向这些2-D向量中的每一个并将这些指针存储在称为形状的向量中。 我的问题在于访问那些单独的0和1(以便将它们与其他形状进行比较)。

例如,给定:

vector<vector<bool> > Shape;
vector<Shape *> shapes;

其中,形状有三个指向我之前给出的二维矢量的元素,我希望能够访问第一个形状的(0,1)位置中的1。

我试过了:

shapes[index]->at(0).at(1);
shapes[index]->at(0)[1];
shapes[index][0][1];

在许多其他事情中,但这些似乎都没有给我我想要的东西。我仍然对指针很新,所以我希望我不会错过一些明显的东西。

提前谢谢!

根据请求,这是我的代码中的一大部分。

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

typedef vector<vector<bool> > Shape;

class ShapeShifter {
public:
    ShapeShifter(int argc, char **argv);
    void Apply(int index, int row, int col);
    bool FindSolution(int index);
    void AddShape(Shape *newShape);
    void AddMove(int index, int row, int col);
    void PrintMoves();
    void PrintGrid();
protected:
    vector<vector<bool> > grid;
    vector<Shape *> shapes;
    vector<string> moves;
};

void ShapeShifter::Apply(int index, int row, int col) {
    int i, j, k;
    int y = 0, z = 0;

    if((row + shapes[index]->size() > grid.size()) || (col + shapes[index]->at(0).size() > grid[0].size())) {
        return; // shape won't fit
    }

    for(i = row; i < (row + shapes[index]->size()); i++) {
        for(j = col; j < (col + shapes[index]->at(0).size()); j++) {
            if(shapes[index]->at(y)[z] == 1) {
                if(grid[i][j] == 0) {
                    grid[i][j] = 1;
                }
                else {
                    grid[i][j] = 0;
                }

            }
            z++;
        }
        z = 0;
        y++;
    }
    return;
}

在这里,我有一个bool网格,我试图用给定索引中的形状来掩盖它,如果形状为1,则网格的相应元素中的bool将被翻转。 / p>

形状矢量用标准输入上的行填充,如下所示:

ShapeShifter sshift(argc, argv);
Shape *newShape;
vector<bool> shapeLine;
int i, j;
string line;

while(getline(cin, line)) {
    j = 0;
    newShape = new Shape;
    for(i = 0; i < line.size(); i++) {
        if(line[i] == ' ') {
            j++;
        }
        else {
            shapeLine.push_back(line[i] - '0');
        }
    }
    newShape->push_back(shapeLine);
    sshift.AddShape(newShape);
    line.clear();
}

void ShapeShifter::AddShape(Shape *newShape) {
    shapes.push_back(newShape);
}

1 个答案:

答案 0 :(得分:0)

为什么使用string的向量而不只是一个二维char数组或任何你需要的?然后,您可以轻松访问它们:shape[x][y]

无论如何,您目前设置它的方式可以访问您想要的值,如下所示: shapes[0]->at(0).at(1);