2013-02-12 6 views
1

키가 int이고 값이 배열 목록 (int[][]) 인지도를 만들고 싶습니다.목록이 포함 된 C++지도

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

하지만 컴파일되지 않으며 (R과 C 프로그램의 매개 변수는 있지만 실행 중에 변경되지 않는) 이유는 ... 이해가 안 :

나는이 시도.

+0

어떤 컴파일러를 사용하고 있습니까? –

+2

"작동하지 않음"은 실제로보고있는 문제에 대한 설명이 아닙니다. 아무도 도와 줄 수 없으면 무엇이 잘못 될지 정말 알려 주어야합니다 ... – sth

+1

대신 벡터를 사용 하시겠습니까? R과 C는 변경되거나 변경되지 않은 프로그램의 매개 변수가 아니어야합니다. 그것들은 일정해야하고 알려진 가치가 있어야합니다. 컴파일 할 때 int [R] [C]의 크기를 알아야하기 때문입니다. 벡터가 C++로 동적으로 크기가 조정 된 배열을 사용해야합니다 (숫자가 알려지지 않은 경우). – Pihhan

답변

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을 가지고 있으며 2D 배열을 동적으로 할당하십시오.

그러나 디자인에 대해 다시 생각해 보겠습니다. 이것은 정말로 당신이 원하는 구조입니까? 데이터 중 하나를 struct으로 그룹화해야합니까?

+1

그러나 OP의 코드는 GCC 4.7.2 및 Clang 3.2 –

+0

에서 정상적으로 컴파일됩니다. 고맙습니다 만 C++ 11이 없습니다 ... 다른 해결책이 있습니까? – Jav

+0

@ Jav : 어떤 컴파일러를 사용하고 있습니까? –