개발 Study

#40. Map

HYuk 2021. 5. 26. 18:35
728x90

#Map

맵을 사용하기 위해선 #include <map>을 해주어야 한다.

맵은 key값과 value값으로 나누어져 있으며 한 쌍을 이룬다.

따라서 key값과 value값에 대해 각각 자료형을 명시해주어야 한다.

map<int, int> MapInt;

이때 Map은 여러방식으로 원소를 삽입 할 수 있지만 

가장 간단한 방법은 emplace이다.

MapInt.emplace(key값, value값) 으로 삽입 할 수 있다.

-> emplace는 vector나 list에서도 사용이 가능하며, emplace_back, emplace_front 등으로 사용한다.


Map은 pair형식이다

따라서 범위기반 포문을 사용할 때에도 for(auto i : MapInt)가 아닌

for(auto pair : MapInt)으로 사용하여야 한다.

이때 pair에는 pair.first , pair.second가 있는데 first는 key값, second는 value값 이다.

pair를 사용하면 insert를 통한 삽입도 가능하다.

-> pair<int, int>   pairInt(1,100);

MapInt(pairInt);

 

그외에는 다음과 같은 방법을 이용하여 삽입이 가능하지만 emplace를 주로 사용한다.

MapInt[0] = 0;
MapInt.insert(pair<int,int>(1,1));
MapInt.insert(make_pair(2,2));
MapInt.insert(map<int,int>::value_type(3,3));
MapInt.emplace(4,4);
MapInt.insert({5,5});

-> 여기서 인덱스[] 접근을 이용한 원소삽입은 원소가 이미 있어도 강제 삽입이 되기 때문에 사용하지 않는다.


Map은 노드 형식 이기 때문에

반복자에서 ++ -- 외에는 사용이 불가능 하다.

 

Map은 key값에 의해서 자동 오름차순 정렬이 된다.

 


#Map의 정렬

 

#include <functional>을 통해

map의 오름차순 내림차순 정렬을 정의할 수 있다.

map<int, int, greater<int>> MapInt;

 

-> greater:내림차순 , less:오름차순


#Map의 멤버함수 find()

-> 원소가 있을 경우 해당 위치를 가리키는 반복자를 반환하며, 원소가 없을 경우 end를 반환한다.

즉, 다음과 같이 나타낼 수 있다.

if(MapInt.end()==MapInt.find(찾을 원소))
cout<< " 찾을 원소를 찾을 수 없습니다"<<endl;

-> 하지만 이 find의 문제점은 단순 값 비교이기 때문에, 포인터형식을 저장하였을 때 단순 주소를 비교하게 된다.

이것을 보완하기 위해서는 find_if를 사용하면된다.

 

이때 값은 두개를 비교해야 하는데 find_if는 단항 조건자를 받는다.

따라서 객체를 만들어 해결해야한다.

	class CCompare
	{
	public:
		CCompare(const char* _pBuff):m_pBuff(_pBuff) {}

	public:
		template <typename T>
		bool operator()(T& _szDst)
		{
			return !strcmp(m_pBuff, _szDst.first);
		}


	private:
		const char* m_pBuff;
	};

 

이와 같이 Compare 클래스를 생성하여 다음과 같이 비교해주고

find_if를 사용하면 된다.

 

char szBuff[16] = "AA";
auto iter = find_if(MapInt.begin(),MapInt.end(),CCompare(szBuff));
728x90

'개발 Study' 카테고리의 다른 글

#42. 스마트 포인터  (0) 2021.11.12
#41. 람다식의 사용  (0) 2021.11.01
#39. List  (0) 2021.05.24
#38. 조건자  (0) 2021.05.23
#37. Vector  (0) 2021.05.23