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

Accessing 3d vector in a class c++

本文关键字:3d 向量 中的 c++ 访问      更新时间:2023-10-16

这是我的简化代码。

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:"游戏::棋盘":语法不规范;使用"&"创建指向成员的指针

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

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

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

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

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

正如其他人所指出的,这变成了一件混乱的事情。最好只使用单个连续的内存阵列,提供多维访问器,如下所示:

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

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

例如,您可以像这样声明板:

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

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

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

但是,对于您的目的而言,这可能有点矫枉过正。只是想让你知道外面有什么。