use*_*898 -1 c++ containers multidimensional-array c++03 visual-studio-2012
我有这个多维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}
}
Run Code Online (Sandbox Code Playgroud)
我想将它们存储在基于索引的容器中,我试图创建另一个应该像这样保存它们的int数组:
int LevelsArray[LEVELS_COUNT] = { anArray1, anArray2};
Run Code Online (Sandbox Code Playgroud)
我得到这个错误:
error C2440: 'initializing' : cannot convert from 'int [68][8]' to 'int'
Run Code Online (Sandbox Code Playgroud)
我想这不是正确的方法..推荐的方式是什么?
我不认为一个普通的旧数组是一个C++容器.因为原因,我宁愿使用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";
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
$ 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
Run Code Online (Sandbox Code Playgroud)
使用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";
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这些示例使用了每个编译器可能不支持的C++ 11功能(初始化列表,基于范围的,std :: array).虽然您可以使用初始化列表初始化容器和基于范围的for循环进行打印,但在C++ 11之前没有std :: array.
以供参考: