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
}

더 알아보기 (Learn more)

cppreference