Map

songtofu·2022년 3월 28일
0

Map

  • Map은 Key와 Value의 쌍을 특별한 순서로 저장하고 있는 연관 컨테이너(associative container)이다. 이진 트리로 구현되어있고 Key를 통해 Value에 접근하고자 할 때, [] 연산자를 사용해서 접근할 수 있다.

Map의 구성

생성자

  1. 기본 생성자
  2. 복사 생성자
    그리고, 비교자 클래스를 사용해서 정렬 방법을 결정할 수 있다.
    ->정렬 순서, 원리 나중.
    Map은 대부분 기본 생성자를 많이 쓴다.

반복자

  • Map의 iterator도 양방향 반복자(Bidirectional iterator)이다.
  • 원소에 접근할 때 iterator와 []연산자를 사용해서 접근 가능.
  • iterator로 접근 가능하며, 대부분 auto로 받아서 씁니다.

+) auto 키워드 :: 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에게 지시한다. 즉, auto 키워드를 사용하면 초깃값의 형식에 맞춰 선언하는 인스턴스(변수)의 형식이 자동으로 결정된다. 이것을 타입 추론(type inference)라고 한다.

간단한 매서드

  1. Insert
pair<iterator,bool> insert (const pair<const Key, Type>& val);

리턴값으로 pair를 톨려준다.

insert 결과첫번째(iterator)두번째(bool)언제 발생
성공insert되어진 element의 iteratortrue중복된 Key가 존재 하지 않을때
실패중복된 Key의 element의 iteratorfalse중복된 Key가 존재 할때

insert를 한다는 것도 내부적으로 insert할 위치를 찾아간다.

잘못된 예제)

std::map<int, std::string> temp;
auto itr = temp.find(1);
if (itr == temp.end())
{
    temp.insert({ 1, "number 1" });
}
else
{
    itr->second = "number 1";
}

정확한 사용법)

std::map<int, std::string> temp;
auto ret = temp.insert({ 1, "number 1" });
if (!ret.second)
{
    ret.first->second = "number 1";
}

operator[]를 호출하는 순간 insert가 발생한 다는 것을 알고 있어야 한다.

  1. Erase
(1)	
     void erase (iterator position);
(2)	
size_type erase (const key_type& k);
(3)	
     void erase (iterator first, iterator last);

(1) iterator을 사용한 삭제
(2) key값을 사용한 삭제
(3) iterator 범위를 사용한 삭제

  1. Find
iterator find (const key_type& k);
  • key값을 통해 해당 Key값을 가지는 노드를 찾는다.
  • 리턴값 : 해당 노드를 가리키는 iterator가 존재 = 해당 노드의 iterator, 존재 X = map::end를 반환.
  1. Count
size_type count (const key_type& k) const;
  • key값을 통해 해당 Key값을 가지는 노드를 찾는다.
  • 리턴값 : 해당 노드를 가리키는 iterator가 존재 = 1, 존재 X = 0 반환.

Map 연산자

  1. operator != : map 개체가 우변에 있는 map 개체와 같지 않은지 테스트, map 개체 간의 비교는 해당 요소의 쌍비교를 기반으로 한다. 포함된 요소 수가 같고 개별 요소의 값이 같으면 두 map은 같은 것.. 그렇지 않으면 같지 않은 것.

  2. operator < : map 개체 간의 비교는 해당 요소의 쌍 비교를 기반으로 한다. 두 개체 간의 보다 작음 관계는 같지 않은 요소의 첫 번째 쌍 비교를 기반으로 한다.

  3. operator!= (multimap) : 연산자의 조변에 있는 multimap 개체가 우변에 있는 multimap 개체와 같지 않은지 테스트, multimap 개체 간의 비교는 해당 요소의 쌍 비교를 기반으로 한다. 포함된 요소 수가 같고 개별 요소의 값이 같으면 두 multimap은 같은 것. 그렇지 않으면 목록은 같지 않은 것.

  4. ...

+) map
+) multimap

출처

profile
읽으면 머리에 안들어와서 직접 쓰는 중. 잘못된 부분 지적 대환영

0개의 댓글