Namespaces
Variants

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>:: insert

From cppreference.net
std:: pair < iterator, bool > insert ( const value_type & value ) ;
(1) (C++23부터)
std:: pair < iterator, bool > insert ( value_type && value ) ;
(2) (C++23부터)
iterator insert ( const_iterator pos, const value_type & value ) ;
(3) (C++23부터)
iterator insert ( const_iterator pos, value_type && value ) ;
(4) (C++23부터)
template < class P >
std:: pair < iterator, bool > insert ( P && x ) ;
(5) (C++23부터)
template < class P >
iterator insert ( const_iterator pos, P && x ) ;
(6) (C++23부터)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(7) (C++23부터)
template < class InputIt >
void insert ( std:: sorted_unique_t , InputIt first, InputIt last ) ;
(8) (C++23부터)
void insert ( std:: initializer_list < key_type > ilist ) ;
(9) (C++23부터)
void insert ( std:: sorted_unique_t s, std:: initializer_list < key_type > ilist ) ;
(10) (C++23부터)

컨테이너에 동등한 키를 가진 요소가 아직 없는 경우 요소를 삽입합니다.

1) value 를 삽입합니다. 다음 코드와 동일합니다: return emplace ( value ) ; .
2) value 를 삽입합니다. return emplace ( std :: move ( value ) ) ; 와 동등합니다.
3) value pos 바로 앞 위치에 가능한 한 가깝게 삽입합니다. return emplace_hint ( pos, value ) ; 와 동일합니다.
4) value pos 바로 앞 위치에 최대한 가깝게 삽입합니다. return emplace_hint ( pos, std :: move ( value ) ) ; 와 동일합니다.
5) 만약 * this 에 이미 투명하게 비교 가능한 동등한 요소가 포함되어 있으면 아무 작업도 수행하지 않습니다. 그렇지 않으면 x * this 에 다음과 같이 삽입합니다: emplace ( std:: forward < P > ( x ) ) ; . 이 오버로드는 std:: is_constructible_v < std:: pair < key_type, mapped_type > , P > true 인 경우에만 오버로드 해결에 참여합니다.
6) 만약 * this 가 이미 투명하게 비교 가능한 동등한 요소를 포함하고 있다면, 아무 작업도 수행하지 않습니다. 그렇지 않으면, x * this pos 바로 앞 위치에 가능한 한 가깝게 삽입합니다. 다음 코드와 동등합니다: return emplace_hint ( pos, std:: forward < P > ( x ) ) ; . 이 오버로드는 다음 조건이 true 일 때만 오버로드 해결에 참여합니다: std:: is_constructible_v < std:: pair < key_type, mapped_type > , P > .
7) 범위 [ first , last ) 의 요소들을 다음과 같은 연산을 순차적으로 수행하는 것처럼 삽입합니다:
  1. 다음처럼 c 에 요소들을 추가합니다:
    for ( ; first ! = last ; ++ first )
    {
    value_type value = * first ;
    c. keys . insert ( c. keys . end ( ) , std :: move ( value. first ) ) ;
    c. values . insert ( c. values . end ( ) , std :: move ( value. second ) ) ;
    }
  2. 새로 삽입된 요소들의 범위를 value_comp 를 기준으로 정렬합니다.
  3. 결과로 얻은 정렬된 범위와 기존 요소들의 정렬된 범위를 단일 정렬된 범위로 병합합니다.
  4. 다음과 같이 중복 요소들을 제거합니다:
    auto zv = std :: views:: zip ( c. keys , c. values ) ;
    auto it = ranges:: unique ( zv, key_equiv ( compare ) ) . begin ( ) ;
    auto dist = std:: distance ( zv. begin ( ) , it ) ;
    c. keys . erase ( c. keys . begin ( ) + dist, c. keys . end ( ) ) ;
    c. values . erase ( c. values . begin ( ) + dist, c. values . end ( ) ) ;
제자리 병합 작업 중 메모리를 할당할 수 있습니다.
범위 내에서 비교 시 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 명시되지 않습니다 (보류 중인 LWG2844 ).
8) 범위 [ first , last ) 의 요소들을 다음과 같은 작업을 순차적으로 수행하는 것처럼 삽입합니다:
  1. 다음 작업처럼 c 에 요소들을 추가합니다:
    for ( ; first ! = last ; ++ first )
    {
    value_type value = * first ;
    c. keys . insert ( c. keys . end ( ) , std :: move ( value. first ) ) ;
    c. values . insert ( c. values . end ( ) , std :: move ( value. second ) ) ;
    }
  2. 새로 추가된 요소들의 정렬된 범위와 기존 요소들의 정렬된 범위를 단일 정렬된 범위로 병합합니다.
  3. 다음 작업처럼 중복 요소들을 제거합니다:
    auto zv = std :: views:: zip ( c. keys , c. values ) ;
    auto it = ranges:: unique ( zv, key_equiv ( compare ) ) . begin ( ) ;
    auto dist = std:: distance ( zv. begin ( ) , it ) ;
    c. keys . erase ( c. keys . begin ( ) + dist, c. keys . end ( ) ) ;
    c. values . erase ( c. values . begin ( ) + dist, c. values . end ( ) ) ;
제자리 병합 작업 중 메모리를 할당할 수 있습니다.
범위 내에 비교 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 지정되지 않습니다 (보류 중인 LWG2844 ).
9) 초기화 리스트로부터 요소들을 삽입합니다 ilist . 다음 코드와 동일합니다 insert ( ilist. begin ( ) , ilist. end ( ) ) ; .
범위 내에 비교 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 지정되지 않습니다 (보류 중인 LWG2844 ).
10) 초기화자 목록 ilist 에서 요소들을 삽입합니다. insert ( s, ilist. begin ( ) , ilist. end ( ) ) ; 와 동등합니다.
범위 내에서 비교 시 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 명시되지 않습니다 (보류 중인 LWG2844 ).

목차

매개변수

pos - 새 요소가 삽입될 위치 앞을 가리키는 반복자
value - 삽입할 요소 값
first, last - 삽입할 요소들의 소스 범위 를 정의하는 한 쌍의 반복자
ilist - 값을 삽입할 초기화자 리스트
x - 키와 투명하게 비교될 수 있는 임의의 타입의 값
s - 입력 시퀀스가 정렬되어 있고( value_comp() 기준) 고유한 요소만 포함함을 나타내는 분해 태그
타입 요구사항
-
InputIt LegacyInputIterator 요구사항을 충족해야 함.

반환값

1,2) 삽입된 요소(또는 삽입을 방해한 요소)에 대한 반복자와 삽입이 발생한 경우에만 bool 값이 true 로 설정된 쌍입니다.
3,4) 삽입된 요소에 대한 반복자, 또는 삽입을 방해한 요소에 대한 반복자.
5) 삽입된 요소(또는 삽입을 방해한 요소)에 대한 반복자와 삽입이 발생한 경우에만 bool 값이 true 로 설정된 쌍.
6) 삽입된 요소에 대한 반복자, 또는 삽입을 방해한 요소에 대한 반복자.
7-10) (없음)

예외

1-6) 어떤 연산에 의해 예외가 발생하면, 삽입은 아무런 효과를 가지지 않습니다.

복잡도

1-6) size() 에 대해 선형 시간 복잡도를 가집니다.
7) N + M·log ( M ) , 여기서 N 은 작업 전의 size() 이고 M std:: distance ( first, last ) 입니다.
8) 크기에 대해 선형적으로 size() .
9) N + M·log ( M ) , 여기서 N 은 연산 전의 size() 이고 M ilist. size ( ) 입니다.
10) 선형 복잡도를 가지며, 여기서 N 은 연산 후의 size() 값입니다.

참고 사항

힌트를 사용한 삽입 ( ( 3,4 ) ( 6 ) )은 std::vector::insert 와 같은 순차 컨테이너의 위치 기반 삽입과 시그니처 호환성을 유지하기 위해 boolean을 반환하지 않습니다. 이를 통해 std::inserter 와 같은 일반화된 삽입기를 생성할 수 있습니다. 힌트 삽입의 성공 여부를 확인하는 한 가지 방법은 삽입 전후의 size() 를 비교하는 것입니다.

예제

참고 항목

제자리에서 요소를 생성
(public member function)
힌트를 사용하여 제자리에서 요소 생성
(public member function)
요소를 삽입하거나 키가 이미 존재하는 경우 현재 요소에 할당
(public member function)
인수에서 유추된 타입의 std::insert_iterator 생성
(function template)