flat_multimap

flat_multimap (std::flat_multimap — 평면 멀티맵)

std::flat_multimap컨테이너 어댑터로, 같은 키 값을 여러 개 가질 수 있는 키-값 쌍을 담는 연관 컨테이너의 기능을 제공해요. 키는 비교 함수 Compare를 써서 정렬돼요.

출처: cppreference

본문

클래스 템플릿 flat_multimap은 두 개의 내부 컨테이너(각각 KeyContainer, MappedContainer 타입의 객체)를 감싸는 래퍼 역할을 해요. 첫 번째 컨테이너는 정렬되어 있고, 각 키에 대응하는 값은 두 번째 컨테이너의 같은 인덱스(오프셋) 위치에 있어요. 두 컨테이너의 원소 개수는 같아요.

표준 라이브러리가 Compare 요구 사항을 쓰는 곳마다, 동등성은 동치 관계(equivalence relation)로 결정돼요. 간단히 말해 두 객체 ab는 서로가 상대보다 작다고 비교되지 않을 때(!comp(a, b) && !comp(b, a)) 동등한 것으로 봐요.

std::flat_multimapContainer, ReversibleContainer, 선택적 컨테이너 요구 사항을 만족하며, AssociativeContainer의 모든 요구 사항(로그 검색 복잡도 포함)을 다음 예외와 함께 만족해요.

  • 노드 관련 요구 사항은 적용되지 않아요.
  • 이터레이터 무효화 요구 사항이 달라요.
  • 삽입·삭제 연산의 복잡도는 선형(linear)이에요.

평면 멀티맵은 같은 키를 쓰는 AssociativeContainer 연산의 대부분을 지원해요.

std::flat_multimap의 모든 멤버 함수는 constexpr이에요. 그래서 상수 표현식 평가에서 std::flat_multimap 객체를 만들고 쓸 수 있어요. 다만 constexpr std::flat_multimap 변수를 정의하는 건 보통 오류예요. 상수 평가는 동적 할당 저장소가 같은 평가에서 해제되길 요구하는데, std::flat_multimap의 초기화에서는 보통 그렇지 않기 때문이에요. (since C++26)

템플릿 매개변수

  • Key: 키의 타입. KeyKeyContainer::value_type과 같은 타입이 아니면 프로그램은 ill-formed예요.
  • T: 매핑된 값의 타입. TMappedContainer::value_type과 같은 타입이 아니면 프로그램은 ill-formed예요.
  • Compare: 엄격한 약순서(strict weak ordering)를 제공하는 Compare 타입.
  • KeyContainer, MappedContainer: 키와 매핑값을 각각 저장하는 내부 SequenceContainer의 타입. 이 컨테이너의 이터레이터는 LegacyRandomAccessIterator를 만족하거나 random_access_iterator를 모델링해야 해요. sizemax_size 멤버 함수 호출은 예외로 빠져나가면 안 돼요. 표준 컨테이너 std::vectorstd::deque가 이 요구 사항을 만족해요.

멤버 타입

  • key_type = Key
  • mapped_type = T
  • value_type = std::pair<key_type, mapped_type>
  • key_container_type = KeyContainer
  • mapped_container_type = MappedContainer
  • containers = std::pair<key_container_type, mapped_container_type>
  • size_type = typename KeyContainer::size_type
  • difference_type = typename KeyContainer::difference_type
  • key_compare = Compare
  • value_comparekey_comp로 쌍의 첫 성분을 비교해 value_type 객체를 비교하는 함수 객체
  • reference = value_type&
  • const_reference = const value_type&
  • iterator — LegacyRandomAccessIterator를 만족하는 타입
  • const_iterator — LegacyRandomAccessIterator를 만족하는 타입
  • reverse_iterator = std::reverse_iterator<iterator>
  • const_reverse_iterator = std::reverse_iterator<const_iterator>

멤버 함수

  • 생성자/파괴자, operator=, assign_range, get_allocator
  • 원소 접근: begin, end, rbegin, rend
  • 용량: empty, size, max_size
  • 수정자: clear, insert, insert_range, insert_or_assign, emplace, emplace_hint, erase, erase_if, swap, extract, replace
  • 탐색: count, find, contains, equal_range, lower_bound, upper_bound
  • 관찰자: key_comp, value_comp
  • 비멤버 함수: operator==, operator<=>, std::erase, std::erase_if, std::swap

더 알아보기 (Learn more)

cppreference