2016-03-01 92 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>'' –