访问类c ++中的3d矢量

时间:2016-03-01 17:08:17

标签: c++ class vector

所以这是我的简化代码。

class Game
{
public:
    void helper(char c);
    vector<vector<vector<char>>> board(5, vector<vector<char>>(10, vector<char>(40)));
    Game();
};

void Game::helper(char c)
{
    int tempY = 0;
    int tempX = 0;
    int temp1 = 0;  
    if (board[temp1][tempY][tempX] != 'c')
    {
        board[temp1][tempY][tempX] = c;
    }
}
int main()
{
    Game game;
    game.helper('C');
    cout<<game.board[0][0][0]<<endl;
}

然后我在这一行得到了2个错误:

 if (board[temp1][tempY][tempX] != 'c')

1。错误C3867:&#39; Game :: board&#39 ;:非标准语法;使用&#39;&amp;&#39;创建指向成员的指针

  1. 错误C2109:下标需要数组或指针类型

3 个答案:

答案 0 :(得分:2)

您需要打开编译器上的警告。

vector<vector<vector<char>>> board(5, vector<vector<char>>(10, vector<char>(40)));

正被转换为名为board的函数,该函数返回vector<vector<vector<char>>>并接收无效参数。您需要使用像

这样的类初始化
vector<vector<vector<char>>> board = vector<vector<vector<char>>>(5, vector<vector<char>>(10, vector<char>(40)));

或者创建一个构造函数来初始化它。

所有这一切都说你不应该真正嵌套向量。您可以打破容器的缓存友好性,因为并非所有嵌套向量都需要在内存中彼此相邻。通常你要做的是使用1d向量并使用数学伪造尺寸。

答案 1 :(得分:0)

正如其他人所说,这变得一团糟。最好只使用一个连续的内存阵列,提供多维访问器,如:

template <typename T>
class vector3d {
public:
    vector3d(size_t d1=0, size_t d2=0, size_t d3=0, T const & t=T()) :
        d1(d1), d2(d2), d3(d3), data(d1*d2*d3, t)
    {}

    T & operator()(size_t i, size_t j, size_t k) {
        return data[i*d2*d3 + j*d3 + k];
    }

    T const & operator()(size_t i, size_t j, size_t k) const {
        return data[i*d2*d3 + j*d3 + k];
    }

private:
    size_t d1,d2,d3;
    std::vector<T> data;
};

答案 2 :(得分:0)

只是跳到这里,如果你可以使用Boost库,它们有一个multi_array容器,允许你在运行时指定多维数组,所以你得到了很好的{ {1}}界面,没有嵌套的board[0][1][2],它可能(没有经过测试)比嵌套向量快得多。

例如,你会像这样宣布董事会:

vector

然后您可以像这样访问它:

boost::multi_array<char, 3> board(boost::extents[5][10][40]);
但是,对你的目的而言,这可能有点过分。只是想让你知道那里有什么。