프로그래밍 언어/C++ STL

STL Map

뽀또치즈맛 2024. 12. 2. 19:47

 

map이란?

맵은 딕셔너리 구조를 가진다.
키를 통해서 값을 가져온다.
 
키와 값을 쌍으로 저장한다.
C++ map은 자동 정렬되는 컨테이너이다.
이진 탐색 트리 오름차순 기반이다.
 

// 맵만들기 예시

int mian()
{
    std::map<std::string, int> simpleScoreMap;
    
    // 삽입 방법 1
    simpleScoreMap.insert(std::pair<std::string, int>("Mocha", 100));
    simpleScoreMap.insert(std::pair<std::string, int>("Coco", 50));
    
    // 삽입 방법 2 || 이 방법은 접근 방법이기도 하다
    simpleScoreMap["Mocha"] = 0;
    
    std::cout << "Current size: " << simpleScoreMap.size() << std::endl;
    
    return 0;
}

 
 
맵도 복사 생성자가 있을까? 있다.
맵의 복사 생성자 작성법

// 복사 생성자를 이용한 맵 생성
map<<key_type>,<value_type>><name>(const map& x)

// 빈 map 생성
map<<key_type>,<value_type>><name>

 
 

두 가지 삽입 방법

 

1. insert()

std::pair<iterator, bool> insert(const value_type& value)

 

  • 반복자와 bool 값을 한 쌍으로 반환한다.
    반복자는 요소를 가리키고, bool 값은 삽입 결과를 알려준다.
  • 키를 중복으로 삽입할 수 없다.

 
 

2. operator []

mapped_type& operator[](const Key& key);
  • key에 대응하는 값을 참조로 반환한다.
    참조로 해야만 값을 대입했을 때 원본이 바뀐다.
  • map에 키가 없으면 새 요소를 삽입하고,
  • map에 키가 있으면 그 값을 덮어쓴다.

연산자 [] 같은 경우에는 return map["Coco"] 이런식으로 반환하면,
없으면 삽입을 하기 때문에 기본값 설정이 되어버린다.
따라서 생각하지 않았던 행동을 반환할 수 있다.
 
따라서 find를 써서 그 값이 있다면 연산자 []를 사용하고 접근하거나,
없다면 다른 값을 반환하는 식으로 하면 좋다.

if (m.find('A') == m.end())
    cout << "key 'A' doesn't exist" << "\n";
    return -1;
else
    cout << "key 'A' exist" << "\n";
    return m[A];

 
 
 

그 외 맵의 기능들

// 두 map의 키와 값을 서로 맞바꾼다.
void swap(map& other);

// map을 비운다
void clear();

// 두 함수 예시
std::map<std::string, int> scoreMap;
std::map<std::string, int> anotherScoreMap;

scoreMap.swap(anotherScoreMap);

anotherScoreMap.clear();

// erase() 오버라이딩된 3가지 함수
// map의 요소들을 제거한다

void erase(iterator position);
size_type erase(const key_type& key);
void erase(iterator first, iterator last);

 
 

개체를 키로 사용하기 위한 조건 

 

방법 1. operator <

개체를 키로 사용하고 싶다면, 
첫 번째 방법으로는 operator < () 를 만들어줘야 한다.
 

// 연산자 예시
bool StudentInfo::operator<(const StudentInfo& other) const
{
    if(mName == other.mName) return mStudentID < other.mStudentID
    
    return mName < other.mName;
}

 
 

방법 2. map을 만들 때 비교함수(comparer)를 넣기

struct StudentInfo {
    int grade;
    string name;
}

struct StudentInfoComparer {
	bool operator()(const StudentInfo& left, const StudentInfo& right) const
    {
    	return(left.getName() < right.getName());
    }
};

std::map<StudentInfo, int, StudentInfoComparer> Scores;

 
 

맵의 장점과 단점

 

맵의 장점

맵의 장점으로는, list나 vector보다 탐색 속도가 빠르다.
 

맵의 단점

자동으로 정렬되며 해쉬맵이 아니다.
따라서 O(1)이 아니다.
탐색 속도는 이진 트리 기반이기에 O(logn)이다.