'멀티맵'에 해당되는 글 1건

  1. 2008/03/07 귀차니스트 Multimap - 때로는 유용한 컨테이너

  std::vector, std::list 등의 간단한 데이터 컨테이너나 std::map 같은 1:1 매칭 컨테이너를 사용하면 한 가지 아쉬울 때가 있습니다. 바로 1:Many 매칭 구조에서 자료를 쉽게 사용할 수 없다는 것인데요. 잘 모르는 분은 구현
을 위해서 std::pair 등을 사용하여 구현하기도 합니다만 이 것은 큰 낭비라고 할 수 있죠.

vectorPair.cpp (Language : cpp)
  1. #include <vector>
  2. int main( int argc, char **argv )
  3. {
  4.     std::vector< std::pair< int, double > > Abc;
  5.     Abc.push_back( std::make_pair( 1, 1.1 ) );
  6.     Abc.push_back( std::make_pair( 1, 2.1 ) );
  7.     Abc.push_back( std::make_pair( 1, 3.1 ) );
  8.     Abc.push_back( std::make_pair( 2, 4.1 ) );
  9.     Abc.push_back( std::make_pair( 4, 5.1 ) );
  10.     for( std::vector< std::pair< int, double > >::const_iterator Iter = Abc.begin(); Iter != Abc.end(); ++Iter ){
  11.         std::pair< int ,double > Data = *Iter;
  12.         // Data.fisrt 가 같을 경우 처리..
  13.     }
  14.     return 0;
  15. }

  이렇게 작성할 수도 있지만 이 것은 std::pair 에 대한 불필요한 값이 복사되는 cost가 발생함으로 비효율적인 코드가 될 수 있습니다. 그래서 기본적으로 지원하는 Container로써 std::multimap이 존재하죠. 물론 추가적으로 std::map 이 std::hash_map으로 확장되어 비표준 Container로써 지원되듯이 std::multimap 또한 std::hash_multimap 으로 확장되어 비표준으로 지원되긴 합니다. 하지만 간단히 std::multimap을 살펴보면 다음과 같이 사용할 수 있습니다.

multimap.cpp (Language : cpp)
  1. #include <map>
  2. int main( int argc, char **argv )
  3. {
  4.     std::multimap< int, double > Abc;
  5.     Abc.insert( std::make_pair( 1, 2.1 ) );
  6.     Abc.insert( std::make_pair( 1, 2.1 ) );
  7.     Abc.insert( std::make_pair( 1, 3.1 ) );
  8.     Abc.insert( std::make_pair( 2, 4.1 ) );
  9.     Abc.insert( std::make_pair( 4, 5.1 ) );
  10.     std::multimap< int, double >::const_iterator StartIter  = Abc.lower_bound( 1 );
  11.     std::multimap< int, double >::const_iterator EndIter    = Abc.upper_bound( 1 );
  12.     while( StartIter != EndIter )   {
  13.         // StartIter->first 가 같은것에 대한 second 값 처리
  14.     }
  15.     return 0;
  16. }

  다음과 같이 된다면 불필요한 값 뿐만 아니라 loop 에 있어서 모든 부분을 참조하지 않아도 되기 때문에 그 만큼의 비용이 절감된다고 생각할 수 있습니다. 그리고 추가적으로 hash_map, hash_multimap 같은 경우는 비표준이기 때문에 들어있는 namespace가 달라질 수 있습니다. 예를 들면 VS.net 2003 같은 경우 std에, VS.net 2008 같은 경우 stdext 에 들어있죠. 때에 따라 알맞은 Container를 사용하여 cost를 줄이는게 좋을것 같습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/03/07 20:30 2008/03/07 20:30

댓글을 달아 주세요