这是我的简化代码。
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:下标需要数组或指针类型
您需要打开编译器上的警告。
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;
但是,对于您的目的而言,这可能有点矫枉过正。只是想让你知道外面有什么。