'depth sorting'에 해당되는 글 1건

  1. 2014.07.10 STL의 map 과 multimap의 간단한 설명 및 실사용 예제

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값을 기준으로 자동 내림차순 정렬이 되어 문제를 해결하였다.

 


 

Posted by Tommy™
,