2012-11-29 4 views
2

일부 SystemVerilog를 SystemC/C++로 포팅하고 다차원 연관 배열에 문제가 있습니다. SV에서이 배열의 선언을 고려하십시오.C++에서 다차원 연관 배열을 구현하는 방법은 무엇입니까?

// assume typ_one, typ_two, typ_three are struct or enum types 
typ_one mda[typ_two][typ_two][typ_three]; 

나는 1-D 연관 배열과 내가지도를 사용할 수 있습니다 알고, 2-D 어레이와 중첩지도, 나는 비슷한 접근 방식은 다차원 배열을 해결할 수 있다고 생각하지만 정말 지저분 가져옵니다.

typ_one mda[typ_two]; 
map< typ_two, typ_one >; 

typ_one mda[typ_two][typ_two]; 
map< typ_two, map< typ_two, typ_one > >; 

typ_one mda[typ_two][typ_two][typ_three]; 
map< typ_two, map< typ_two, map< typ_three, typ_one > > >; 

그래서 내 질문은 ,

(1)입니다 위의 올바른 mda[x][y][z]의 형태로 작업이 SV 코드와 같은 예상 값을 반환한다는 의미에서?

(2) 더 좋고 깨끗한 방법이 있습니까?

+1

튜플에'std :: tuple'을 C++ 11로, 그렇지 않으면'boost :: tuple'을 찾습니다. – andre

+0

SystemVerilog에 익숙하지 않습니다. 위의 세 가지 저장된 객체 모두에 "typ_one"의 맵을 선언합니까? – Dennis

+0

Dennis, 죄송합니다. 오류가 발생했습니다. SV 3-d 어레이의 구문을 수정했습니다. – Rich

답변

1

std :: map 예제가 원하는대로 할 수 있습니다.

불행히도 C++에는 일반적인 배열처럼 연관 배열에 대한 특수 구문이 없기 때문에 더 깨끗한 방법은 없습니다. (불행히도 이러한 배열은 Java/C#과 같은 배열 객체가 아니라 원시 배열입니다. 이와

0
template<class T1, class T2, class ... Ts> 
    struct MultiDimensionalMap{ 
     typedef std::map<T1, typename MultiDimensionalMap<T2,Ts...>::map_type> map_type; 
    }; 

    template<class T1, class T2> 
    struct MultiDimensionalMap<T1,T2>{ 
     typedef std::map<T1,T2> map_type; 

    }; 

, 당신의 예를 들어, 당신은 그것을 구현하는 적어도 두 가지 방법이 있습니다 다음

MultiDimensionalMap<type_two,type_two,type_three,type_one>::map_type m; 
0

사용할 수 있습니다. 중첩의 원하는 수준 등을지도 또는지도의지도 : 당신이 당신의 질문에 자신을 제안으로

  • 첫 번째는 중첩 된 맵을 사용하는 것입니다.

  • 두 번째는 키가 인덱스의 튜플 (즉, 3D 연관 배열의 경우 3 개의 인덱스) 인 일반 선형 맵을 사용하는 것입니다.

첫 번째 방법을 고수해야하는 특별한 이유가 없다면 실제로 두 번째 방법을 고려해보십시오.