2017. 1. 4. 22:54ㆍIT-개발/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 |