我有这个多维2阵列
int anArray1[MAX_ROW][MAX_CELL] =
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
}
int anArray2[MAX_ROW][MAX_CELL] =
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
}
我希望将它们存储在基于索引的容器中,我试图创建另一个应该像这样保存它们的int数组:
int LevelsArray[LEVELS_COUNT] = { anArray1, anArray2};
我收到此错误:
error C2440: 'initializing' : cannot convert from 'int [68][8]' to 'int'
我猜这不是正确的方法.. 建议的方式是什么?
答案 0 :(得分:5)
我不认为普通的旧数组是C ++容器。由于reasons,我宁愿使用std::vector
(或std::array
)的组合。
以下是一个例子:
#include <iostream>
#include <vector>
typedef int cell;
typedef std::vector<cell> row;
typedef std::vector<row> level;
typedef std::vector<level> levels;
int main() {
levels l =
{
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
},
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
},
};
for (int i = 0; i < l.size(); i++) {
std::cout << "level " << i << ":\n" ;
for (row & r : l[i]) {
for (cell & c : r)
std::cout << c << " ";
std::cout << "\n";
}
std::cout << "\n";
}
}
输出结果为:
$ g++ test.cc -std=c++11 && ./a.out
level 0:
0 1 1 0 1 1 1 0
0 1 1 0 1 1 1 0
0 1 1 0 1 1 1 0
0 1 1 0 1 1 1 0
0 0 0 0 0 0 0 0
level 1:
0 1 1 0 1 1 1 0
0 1 1 0 1 1 1 0
0 1 1 0 1 1 1 0
0 1 1 0 1 1 1 0
0 0 0 0 0 0 0 0
使用std::array
可能看起来像这样:
#include <iostream>
#include <vector>
#include <array>
const int cells_per_row = 8;
const int rows_per_level = 5;
const int nlevels = 2;
typedef int cell;
typedef std::array<cell, cells_per_row> row;
typedef std::array<row, rows_per_level> level;
typedef std::array<level, nlevels> levels;
int main() {
levels l =
{
level{
row{ 0, 1, 1, 0, 1, 1, 1, 0},
row{ 0, 1, 1, 0, 1, 1, 1, 0},
row{ 0, 1, 1, 0, 1, 1, 1, 0},
row{ 0, 1, 1, 0, 1, 1, 1, 0},
row{ 0, 0, 0, 0, 0, 0, 0, 0}
},
level{
row{ 0, 1, 1, 0, 1, 1, 1, 0},
row{ 0, 1, 1, 0, 1, 1, 1, 0},
row{ 0, 1, 1, 0, 1, 1, 1, 0},
row{ 0, 1, 1, 0, 1, 1, 1, 0},
row{ 0, 0, 0, 0, 0, 0, 0, 0}
},
};
for (int i = 0; i < l.size(); i++) {
std::cout << "level " << i << ":\n" ;
for (row & r : l[i]) {
for (cell & c : r)
std::cout << c << " ";
std::cout << "\n";
}
std::cout << "\n";
}
}
请注意,这些示例使用了每个编译器可能不支持的C ++ 11功能(初始化列表,基于范围的,std :: array )。虽然您可以使用初始化列表初始化容器和基于范围的for循环进行打印,但在C ++ 11之前没有std :: array。
供参考:
答案 1 :(得分:1)
您可以使用LevelsArray类型的更明确声明
int LevelsArray[LEVELS_COUNT][MAX_ROW][MAX_CELL] = { {...}, {...} };
然而,C ++的方式是使用std::vector
或std::array
(需要C ++ 11):
std::vector<std::vector<std::vector<int>>> LevelsArray =
{
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
},
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
}
};
或
std::array<std::array<std::array<int, MAX_CELL>, MAX_ROW>, LEVELS_COUNT> LevelsArray =
{
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
},
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
}
};
答案 2 :(得分:0)
您缺少指定容器的其他尺寸,这取决于所包含的元素。试试这个
int LevelsArray[][MAX_ROW][MAX_CELL] =
{
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
},
{
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 1, 1, 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0}
}
};
将元素(2D数组)作为单独的数组意味着您不能将这些数组存储在另一个数组中;你可能只存储指针。使用这种方法,您可以使用像
这样的引用来引用内部元素auto const &anArray1 = LevelsArray[0];
并在别处使用。