flat_multimap_insert
flat_multimap_insert (std::flat_multimap::insert — 원소 삽입)
std::flat_multimap에 원소를 삽입하는 멤버 함수예요. 값/이동 값, 힌트 위치, P 타입, 이터레이터 범위, std::sorted_equivalent_t 태그, 초기화 목록 등 다양한 형태로 삽입을 지원해요.
출처: cppreference
본문
주요 시그니처는 다음과 같아요 (모두 since C++23).
iterator insert( const value_type& value ); // (1)
iterator insert( value_type&& value ); // (2)
iterator insert( const_iterator pos, const value_type& value ); // (3)
iterator insert( const_iterator pos, value_type&& value ); // (4)
template< class P >
iterator insert( P&& x ); // (5)
template< class P >
iterator insert( const_iterator pos, P&& x ); // (6)
template< class InputIt >
void insert( InputIt first, InputIt last ); // (7)
template< class InputIt >
void insert( std::sorted_equivalent_t, InputIt first, InputIt last ); // (8)
void insert( std::initializer_list<key_type> ilist ); // (9)
template< class InputIt > // (10) 형태의 sorted_equivalent 버전
void insert( std::sorted_equivalent_t s, std::initializer_list<key_type> ilist );
- (1)
value를 삽입해요.return emplace(value);와 동등해요. - (2)
value를 이동 삽입해요.return emplace(std::move(value));와 동등해요. - (3)
pos바로 앞 위치에 최대한 가깝게value를 삽입해요. 힌트 삽입이에요. - (4)
pos바로 앞에 최대한 가깝게value를 이동 삽입해요. - (5)
emplace(std::forward<P>(x));처럼x를*this에 삽입해요.std::is_constructible_v<pair<key_type, mapped_type>, P>가true일 때만 오버로드 해석에 참여해요. - (6)
pos바로 앞에 최대한 가깝게x를 삽입해요.emplace_hint(position, std::forward<P>(x))와 동등해요. - (7) 범위
[first, last)의 원소들을 컨테이너에 삽입해요. - (8,10)
std::sorted_equivalent_t태그를 쓰면 입력이 이미 정렬되어 같은 키가 뭉쳐 있다고 가정하고, 각각의 키를 컨테이너의 적절한 위치에 배치해요. - (9) 초기화 목록
ilist의 원소들을 삽입해요.
멀티맵이라서 이미 같은 키가 있어도 무조건 삽입돼요. 삽입 후 내부 컨테이너는 키 순서로 정렬된 상태를 유지해요. 힌트는 멀티맵의 선형 삽입 특성상 항상 이점이 되진 않을 수 있어요.
반환값
종류별로 다르지만, 단일 원소 오버로드는 삽입된 원소를 가리키는 이터레이터를 반환하고, 범위/초기화 목록 오버로드는 void예요.
복잡도
내부 컨테이너 삽입 특성에 따라 달라요. 보통 범위 삽입은 N'(새로 삽입된 개수) + N·log(N + N') 형태로, 일반적으로 선형 이상이에요.
예제
#include <flat_map>
#include <iostream>
int main()
{
std::flat_multimap<int, char> m;
m.insert(std::pair{1, 'a'});
m.insert({2, 'b'}, std::pair{3, 'c'}); // 힌트 삽입 (예시)
for (auto const& [k, v] : m)
std::cout << k << ':' << v << ' ';
}