Map
map<key, value> -> key에는 정렬될 값, value에는 필요한 값 (Key값을 기준으로 함께 쌍으로 저장 및 정렬됨)
중복된 키값을 허용 X
map 정렬방식
map<int, string, string.less<int>> -> map의 오름차순 (그냥 map<key, value> 사용시 오름차순)
map<int, string, string.greater<int>> -> map의 내림차순
map 추가방식
map<int, string> strMap;
strMap.insert( make_pair( 5, "Rjwu") );
strMap.insert( make_pair<int , string> (5, "RJwu") );
삭제방식
strMap.erase(1); 키값 1의 Pair 가 사라짐
검색방식( 반환타입은 iterator)
map<int, string, string.greater<int>> :: iterator iter;
iter = strMap.find(7);
cout << iter->first << "\t" << iter->second << endl; //first 는 키값, second 는 데이터
multiMap
map과 달리
strMap[5] = "기륜"; 이런방식의 키값과 데이터 추가가 안된다.
또한 multiMap은 map 과 달리 중복된 키값을 허용한다. map 은 중복된 키값이 들어오면 나중에 들어온 pair 가 먼저것을 밀어냄
multimap 은 중복된 키값에 대하여 find로 검색시 먼저 들어온 데이터를 우선시한다.
multimap 은 중복된 키값에 대하여 erase 로 삭제 시 해당 키값에 해당하는 Pair 를 모두 삭제한다.
Include header
#include <map>
<map>만 추가해줘도 map, multimap 둘다 사용이 가능
#include <functional>
오름차순, 내림차순 정렬시, std::greater<key>, std::less<key> 를 사용하기 위한 헤더파일
http://stackoverflow.com/questions/16567699/stdgreater-not-defined-in-msvc2012
위의 블로그를 참고 했습니다. (몇몇 필요한 내용은 추가 및 수정)
실제 사용 예 및 소스코드
Kinect의 depth값을 깊이 단위로 내림차순 정렬을 해야하는 경우가 발생했다.
처음에 map을 사용하셨지만, 치명적인 문제점이 key값이 중복이 안된다는 점!
depth 값이 중첩이 되는 값들은 저장이 안되고 날아가버리는 치명적인 문제가 발생했다.
하지만 multimap은 중복 ket값이 사용 가능하다.
그래서 map의 key 부분에 depth 값을, value값에 만든 구조체를 삽입하여 정렬했다.
//내림차순 정렬
multimap<float, RGBD, greater<float>> m_mapRGBD;
for( int h = 0 ; h < KINECT_RGBD_HEIGHT_MAX ; h ++ )
{
for( int w = 0 ; w < KINECT_RGBD_WIDTH_MAX ; w ++ )
{
m_mapRGBD.insert( make_pair( rgbd.z, rgbd ) ) ;
}
}
따라서 결과적으로 m_mapRGBD안에 depth값을 기준으로 자동 내림차순 정렬이 되어 문제를 해결하였다.
'[ Topics ] > C/C++' 카테고리의 다른 글
윈도우 화면의 배율과 OpenGL 커서 점의 상관관계, 그리고 모니터 및 해상도 정보 (2) | 2016.07.20 |
---|---|
ASSERT 매크로 사용법 (참고) (0) | 2015.07.20 |
문자타입간의 데이터 복사방법(wchar_t, char*, LPCTSTR) (0) | 2014.04.08 |
시스템 타이머를 통해 FPS 구하기 (6) | 2013.12.25 |
원그리는 알고리즘 (4) | 2011.03.25 |