Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: emplace

From cppreference.net

template < class ... Args >
std:: pair < iterator, bool > emplace ( Args && ... args ) ;
(C++11부터)
(C++26부터 constexpr)

컨테이너에 해당 키를 가진 요소가 없을 경우, 주어진 args 로 제자리에서 생성된 새로운 요소를 삽입합니다.

새로운 요소의 생성자(즉 std:: pair < const Key, T > )는 emplace 에 제공된 인자들과 정확히 동일한 인자들로 호출되며, std:: forward < Args > ( args ) ... 를 통해 전달됩니다. 컨테이너에 해당 키를 가진 요소가 이미 존재하는 경우에도 요소가 생성될 수 있으며, 이 경우 새로 생성된 요소는 즉시 파괴됩니다(이 동작이 바람직하지 않은 경우 try_emplace() 참조).

만약 value_type EmplaceConstructible 요구사항을 만족하지 않고 map args 로부터 생성될 수 없다면, 동작은 정의되지 않습니다.

반복자나 참조가 무효화되지 않습니다.

목차

매개변수

args - 요소의 생성자에 전달할 인수들

반환값

삽입된 요소(또는 삽입을 방해한 요소)에 대한 반복자와 삽입이 발생한 경우에만 bool 값이 true 로 설정된 쌍입니다.

예외

어떤 이유로든 예외가 발생하면, 이 함수는 아무런 효과를 가지지 않습니다( strong exception safety guarantee ).

복잡도

컨테이너 크기에 대해 로그 시간 복잡도를 가집니다.

참고 사항

emplace 를 신중하게 사용하면 새로운 요소가 불필요한 복사 또는 이동 연산을 피하면서 생성될 수 있습니다.

예제

#include <iostream>
#include <string>
#include <utility>
#include <map>
int main()
{
    std::map<std::string, std::string> m;
    // pair의 이동 생성자 사용
    m.emplace(std::make_pair(std::string("a"), std::string("a")));
    // pair의 변환 이동 생성자 사용
    m.emplace(std::make_pair("b", "abcd"));
    // pair의 템플릿 생성자 사용
    m.emplace("d", "ddd");
    // 중복 키로 emplace를 호출하면 아무 효과가 없음
    m.emplace("d", "DDD");
    // pair의 piecewise 생성자 사용
    m.emplace(std::piecewise_construct,
              std::forward_as_tuple("c"),
              std::forward_as_tuple(10, 'c'));
    // 대안: m.try_emplace("c", 10, 'c');
    for (const auto& p : m)
        std::cout << p.first << " => " << p.second << '\n';
}

출력:

a => a
b => abcd
c => cccccccccc
d => ddd

참고 항목

힌트를 사용하여 제자리에서 요소를 생성합니다
(public member function)
키가 존재하지 않으면 제자리에서 삽입하고, 키가 존재하면 아무 작업도 수행하지 않습니다
(public member function)
요소를 삽입합니다 또는 노드를 삽입합니다 (since C++17)
(public member function)