map_insert_or_assign
map_insert_or_assign (std::map::insert_or_assign — 삽입 또는 대입)
std::map에 키가 없으면 삽입하고, 이미 있으면 매핑값을 지정한 값으로 덮어쓰는 멤버 함수예요.
출처: cppreference
본문
시그니처는 다음과 같아요 (모두 since C++17, 일부 C++26).
template< class M >
std::pair<iterator, bool> insert_or_assign( const Key& k, M&& obj ); // (1)
template< class M >
std::pair<iterator, bool> insert_or_assign( Key&& k, M&& obj ); // (2)
template< class K, class M >
std::pair<iterator, bool> insert_or_assign( K&& k, M&& obj ); // (3) (since C++26)
template< class M >
iterator insert_or_assign( const_iterator hint, const Key& k, M&& obj ); // (4)
template< class M >
iterator insert_or_assign( const_iterator hint, Key&& k, M&& obj ); // (5)
(1,2,3) k와 동등한 키가 컨테이너에 없으면 obj에서 구성한 value_type(키-값 쌍)을 삽입해요. 이미 있으면 그 키의 매핑값에 std::forward<M>(obj)를 대입해요.
(4,5) 힌트 위치를 사용하는 힌트 오버로드예요. hint 바로 앞에 최대한 가깝게 삽입하거나, 이미 있으면 그 매핑값을 대입해요.
매개변수
k: 찾거나 삽입할 키hint: 새 원소가 삽입될 위치 바로 앞을 가리키는 이터레이터 (힌트 오버로드)obj: 삽입하거나 대입할 값
반환값
- (1,2,3)
{원소를 가리키는 이터레이터, 키가 새로 삽입됐으면 true}쌍. - (4,5) 원소를 가리키는 이터레이터.
복잡도
로그(logarithmic)예요. 힌트 오버로드는 힌트가 삽입 위치 바로 직전을 가리키면 분할 상환 상수.
예제
#include <iostream>
#include <map>
int main()
{
std::map<int, char> m{{1, 'a'}, {2, 'b'}};
m.insert_or_assign(2, 'z'); // 이미 있으므로 대입
m.insert_or_assign(3, 'c'); // 새로 삽입
for (auto& [k, v] : m) std::cout << k << ':' << v << ' '; // 1:a 2:z 3:c
}