#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));
'개발 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 |