msdn : C++ map
https://learn.microsoft.com/ko-kr/cpp/standard-library/map-class?view=msvc-170
<map> 헤더에 포함된 키-쌍 을 저장하는 연관 컨테이너.
중복된 키를 허용하지 않으며 중복을 허용하는 std::multimap 가 별도로 존재한다.
요소가 지정된 비교 함수에 따른 키 값으로 정렬되어 있습니다. 기본은 오름차순 정렬
균형이진트리(AVL)로 구현되어 있다.
삽입/삭제/검색이 O(log n) 의 시간 복잡도를 가진다.
사용법
#include <iostream>
#include <map>
int main() {
std::map<int, std::string> myMap;
// 요소 추가
myMap[1] = "Apple";
myMap[2] = "Banana";
// 요소 접근
std::cout << "Key 1 has value: " << myMap[1] << std::endl;
// 요소 반복 출력
for (const auto& pair : myMap) {
std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;
}
return 0;
}
선언
1. 일반 선언 (키가 int라서 int값에 따른 오름차순 정렬됨)
std::map<int, string> myMap;
2. 내림차순 정렬 (키 기준 내림차순으로 정렬됨)
- T3 에 비교 함수를 넣어주면 된다.
// 내림차순 정렬을 위한 사용자 정의 비교 함수
std::map<int, std::string, std::greater<int>> myMap;
삽입
1. operator[]
아래의 insert와는 달리 이미 값이 있는 경우 대체된다.
myMap[1] = "Apple";
따라서 이미 있는 값을 증가시키고 싶다하면, 아래와 같이 사용할 수 있다.
[] 검색은 값이 없는 경우 만들어 버리니 주의. 아래에 operator []의 검색에 대한 부분도 따로 설명.
myMap[a]++; // 1 증가나 감소
myMap[a] = myMap[a] + n; // n 증가나 감소
2. insert
insert는 두 번 하면 오류가 나지않고 무시된다.
리턴값이 페어로 두개를 묶어서 주는데, 첫번째는 방금 인서트 성공한 이터레이터고, 두번째는 성공여부이다.
myMap.insert(std::make_pair(4, "Date"));
삭제
1. erase(key) / erase(iterator)
리턴값은 삭제된 데이터 갯수이다. 삭제를 못하면 0을 리턴한다.
myMap.erase(2); // 키 2에 해당하는 요소 삭제
2. erase(first, end) 범위 삭제
- 키 값을 기준으로 정렬되어있으니 find(key) 를 통해 iterator를 찾아서 넣어주면된다.
iterator erase( const_iterator First, const_iterator Last);
검색
1. operator[]
std::map::operator[] 는 키를 참조하는 순간 없다면 만들어버린다! 값이 원래있다면 있는것을 리턴한다. 없다면 만들어서 리턴한다!
있는지만 체크하려면 find를 활용해야한다!
2. find
C#과 구현이 많이 다르다. iterator를 리턴하며, 못찾으면 end() 를 리턴하는 특징이 있다.
map<int, int>::iterator it = m.find(10000);
if(it != m.end()
{
// 찾음.
it->second = 5;
}
else
{
// 시도했으나 못찾음. C#의 -1과 같은결과.
m.insert(make_pair(10000, 5);
}
3. at
인수 키 값을 찾을 수 없는 경우 함수는 클래스 out_of_range 클래스의 개체를 throw합니다.
operator[] 와 많이 비교된다. 키가 없는 경우 []는 기본객체를 생성해서 반환하고, at은 예외를 던진다.
myMap.at('a');
사이즈 체크
1. size()
요소의 갯수 반환
int size = myMap.size();
2. empty()
맵이 비어있는지 확인
bool isEmpty = myMap.empty();
기타
1. 이터레이터
맵은 연속 컨테이너가 아니기 때문에 이터레이터에 산술연산 + 는 컴파일 오류가 난다.
이터레이터의 기본 전제인 ++ 연산자는 가능.
std::next 함수는 it를 n만큼 증가시킨다.
auto it1 = _map.begin();
auto it2 = ++_map.begin();
auto it3 = std::next(it1, 1); // it2 == it3
'🌍 C++ Study > C++ 기초' 카테고리의 다른 글
C++ 벡터에 연속된 숫자 채우기 std::iota (0) | 2024.11.15 |
---|---|
C++ int 최대값 구하기 numeric_limits<int>::max() (0) | 2024.11.14 |
C++ 수열의 누적 합, 수열의 누적 처리 accumulate, reduce (0) | 2024.11.13 |
C++ string to int / int to string / stoi, stol, stof (0) | 2024.11.11 |
C++ string 이어 붙이기 (0) | 2024.11.11 |