STL - map - sample(1)

2017. 1. 4. 22:54IT-개발/C및C++

반응형


map의 자료구조는 '트리tree'다(정확하게 말하면 트리 자료구조 중의 하나인 '레드-블랙 트리Red-Black tree'이다).

정렬이 필요하지 않는 곳에서 map을 사용하는 것은 불필요한 낭비이다.


map은 다음 조건일 때 사용하면 좋다.

1. 정렬해야 한다.

2. 많은 자료를 저장하고, 검색이 빨라야 한다

3. 빈번하게 삽입, 삭제하지 않는다.


map은 자료를 저장할 때 정렬을 한다고 말했다. 정렬의 대상은 key를 대상으로 하며 오름차순으로 정렬한다. 그래서 내림차순으로 정렬하고 싶거나 key의 자료형이 기본형이 아닌 유저 정의형(class나 struct로 정의한 것)인 경우

는 정렬 방법을 제공해야 한다.


위에 생성한 map1은 오름차순으로 정렬하는데 이것을 내림차순으로 정렬하고

싶다면 아래와 같이 하면 된다.


map< key 자료형, value 자료형, 비교 함수 > 변수 이름

map< int, int, greater<int> > map1;

위에서 사용한 비교 함수 greater는 STL에 이미 정의되어 있는 템플릿이다.


// key는 1, value는 35를 추가.

map1.insert( map< int, int >::value_type(1, 35));


// 또는 STL의 pair를 사용하기도 한다.

typedef pair < int, int > Itn_Pair;

map1.insert( Int_Pair(2, 45) );

두 번째 방식으로는 특정 위치에 추가할 수 있다.


// 첫 번째 위치에 key 1, value 35를 추가

map1.insert( map1.begin(), map< int, int >::value_type(1, 35) );

// 또는

map1.insert( map1.begin(), Int_Pair(2, 45) );


map< int, int > map2;

// map1의 모든 요소를 map2에 추가.

map2.insert( map1.begin(), map1.end() );


pair< map<int, int>::iterator, bool > Result;

Result = map1.insert( Int_Pair(1, 35));


insert가 아닌 operator[]를 사용하여 추가할 수도 있다.

// key 10, value 80을 추가

map1[10] = 80;


// 정 방향으로 map1의 모든 요소의 value 출력

map< int, int >::iterator Iter_Pos;

for( Iter_Pos = map1.begin(); Iter_Pos != map1.end(); ++Iter_Pos)

{

cout << Iter_Pos.second << endl;

}

// 역 방향으로 map1의 모든 요소의 value 출력

map< int, int >::reverse_iterator Iter_rPos;

for( Iter_rPos = map1.rbegin(); Iter_rPos != map1.rend(); ++Iter_rPos)

{

cout << Iter_rPos.second << endl;

}


위에서 map을 정의할 때 비교함수를 사용할 수 있다고 했다. 만약 비교함수를

사용한 경우는 반복자를 정의할 때도 같은 비교함수를 사용해야 한다.

map< int, int, greater<int> > map1;

map< int, int, greater<int> >::iterator Iter_Pos;


// key가 10인 요소 찾기.

map< int, int >::Iterator FindIter = map1.find( 10 );

// 찾았다면 value를 1000으로 변경

if( FindIter != map1.end() )

{

FindIter->second = 1000;

}


// 두 번째 위치의 요소 삭제.

map1.erase( ++map1.begin() );


// map1의 처음과 마지막에 있는 모든 요소 삭제

map1.erase( map1.begin(), map1.end() );


// key가 10인 요소 삭제.

map1.erase( 10 );


***. 자주 사용해온 map 인데도 이런 내용이 있으라고는 생각도 못했네~ ㅠㅠ









'IT-개발 > C및C++' 카테고리의 다른 글

STL - Set - sample(1)  (0) 2017.01.04
STL - map - sample(2)  (0) 2017.01.04
STL - hash_map - sample(2)  (0) 2017.01.04
STL - hash_map - sample(1)  (0) 2017.01.04
STL - Deque - sample(1)  (0) 2017.01.04