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)이다.
'프로그래밍 언어 > C++ STL' 카테고리의 다른 글
프로그램 인터페이스 예시 STD::vector (0) | 2024.12.10 |
---|---|
STL의 vector, push_back()과 emplace_back() (0) | 2024.11.27 |
STL 여섯 가지 주요 컴포넌트 - 컨테이너 - 시퀀스 컨테이너 (3) | 2024.10.12 |
C++ STL Set (0) | 2024.08.17 |