2013-02-12 65 views
1

我想创建一个映射,其中键是一个int,并且该值是一个数组列表(int[][])。包含一个列表的C++ map

我尝试这样做:

const int R = 4, C = 5; 
std::map<int, std::list<int[R][C]> > s; 

,但它不会编译,我不明白为什么...(R和C程序的参数,但在执行过程中不发生变化)。

+0

你使用什么编译器? – 2013-02-12 14:18:34

+2

“不起作用”对你所看到的问题并不是很好的描述。你应该真的告诉我们,如果你想要任何人能够帮助... – sth 2013-02-12 14:20:08

+1

你确定你不想使用向量?不管是否改变,R和C都不能是程序的参数。它们必须是不变的,必须具有已知的价值。因为int [R] [C]的大小在编译时必须知道。如果该数字未知,则必须使用动态调整大小的数组作为C++中的矢量。 – Pihhan 2013-02-12 14:23:23

回答

4

数组不是可复制或可复制的,它是标准容器的元素必须是可复制的。您的代码将按原样编译,但是数组类型违反了标准容器的要求,您将遇到未定义的行为。您不能拥有std::list<int[R][C]>。然而,C++ 11提供了一个很好的新的编译时间常数大小std::array为您的乐趣:

typedef std::array<std::array<int, C>, R> array_2d; 
typedef std::list<array_2d> array_list; 
std::map<int, array_list> s; 

否则,其他的替代品使用std::vector代替std::array(首选),或有一个int**std::list动态分配你的二维数组。

但是,我会考虑对您的设计进行重新思考。这真的是你想要的结构吗?是否应将任何数据分组到struct

+1

但是,OP的代码在GCC 4.7.2和Clang 3.2 – 2013-02-12 14:20:34

+0

下编译得很好,谢谢,但我没有C++ 11 ...有没有另一种解决方案? – Jav 2013-02-12 14:21:38

+0

@Jav:你在用什么编译器? – 2013-02-12 14:22:07

相关问题