2016-03-01 93 views
-2

所以这里是我的简化代码。访问类C++中的3d矢量

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: '游戏::板':非标准语法;使用“&”创建一个指针构件

  • 错误C2109:下标要求数组或指针类型
  • +0

    请使用大括号! 'vector >> board {5,vector > {10,vector {40}}};' – knivil

    +0

    您是否确实'#包括'?请发布[MCVE]。 –

    +0

    专业提示:错误列表顶部的错误是最重要的错误,因为这是出错的地方。你不能忽视它们,并认为它们不是问题。你必须得到关于你的'board'初始化的错误。它在语法上不合法。 –

    回答

    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向量并使用数学伪造维度。

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

    只是为了在这里桩跳,如果你是适合使用Boost库,他们有一个multi_array容器允许您在运行时指定多维数组,因此您可以获得漂亮的board[0][1][2]接口,不嵌套vector,它可能(未测试它)比嵌套向量快得多。

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

    boost::multi_array<char, 3> board(boost::extents[5][10][40]); 
    

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

    std::cout << board[0][1][2] << std::endl; 
    

    它是,但是,可能有点矫枉过正为您的目的。只是想让你知道那里有什么。

    +0

    这非常有帮助!还有一个问题,如果我想要板子有不同的高度和宽度,有没有什么聪明的方法可以做到?例如,如果我想让board [0]指向的板只有10行和10列而不是40行和10列?而其他人保持不变? – andyz

    +0

    使用multi_array无法做到这一点。底层实现与@Samer Tufail基本相同,其中内存在一个连续的块中。如果第三维是唯一一个变化的,你可以有一个2维的multi_array,它的类型是:boost :: multi_array ,2>'' –