Namespaces
Variants

std::flat_set<Key,Compare,KeyContainer>:: 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 K >
iterator insert ( const_iterator pos, K && x ) ;
(5) (C++23 이후)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(6) (C++23 이후)
template < class K >
std:: pair < iterator, bool > insert ( K && x ) ;
(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) pos 바로 앞 위치에 최대한 가깝게 value 를 삽입합니다. return emplace_hint ( pos, value ) ; 와 동일합니다.
4) pos 바로 앞 위치에 최대한 가깝게 value 를 삽입합니다. return emplace_hint ( pos, std :: move ( value ) ) ; 와 동일합니다.
5,7) 만약 * this 가 이미 x 와 투명하게 비교하여 동등한 요소를 포함하고 있다면, 아무 작업도 수행하지 않습니다. 그렇지 않으면, 다음과 같이 새 요소를 삽입합니다:
x 에서 key_type 로의 변환은 객체 u 를 생성해야 하며, 이에 대해 find ( k ) == find ( u ) true 여야 합니다. 그렇지 않으면 동작은 정의되지 않습니다.
다음 오버로드들은 다음 조건을 만족할 때만 오버로드 해결에 참여합니다:
  • 한정자 ID Compare::is_transparent 가 유효하고 타입을 나타내는 경우, 그리고
  • std:: is_constructible_v < value_type, K > true 인 경우,
이 조건들을 함께 충족하면 Key 인스턴스를 생성하지 않고도 이 함수를 호출할 수 있습니다.
6) 다음 연산 시퀀스와 동등합니다:
  1. 다음 범위에서 요소들을 삽입합니다: [ first , last ) 마치 다음과 같이: c. insert ( c. end ( ) , first, last ) ; .
  2. 새로 삽입된 요소들의 범위를 compare 를 기준으로 정렬합니다.
  3. 결과적으로 정렬된 범위와 기존 요소들의 정렬된 범위를 단일 정렬된 범위로 병합합니다. (참고: 병합 작업은 메모리를 할당할 수 있습니다).
  4. 연속적으로 동등한 요소 그룹에서 첫 번째 요소를 제외한 모든 요소를 삭제합니다.
범위 내에 비교 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 지정되지 않습니다 (보류 중인 LWG2844 ).
8) 범위의 요소들을 삽입합니다 [ first , last ) . 다음 코드와 동일합니다 insert ( first, last ) ; .
범위 내에서 비교 시 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 명시되지 않습니다 (보류 중인 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 - 입력 시퀀스가 정렬되어 있고( compare 기준) 고유한 요소들만 포함함을 나타내는 구분 태그
타입 요구사항
-
InputIt LegacyInputIterator 요구사항을 충족해야 합니다.

반환값

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

예외

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

복잡도

1,2) size() 에 대해 로그 시간 복잡도를 가지며, c 에 대한 삽입 비용이 추가됩니다.
3-5) 삽입이 pos 바로 앞 위치에서 발생하는 경우 분할 상수 시간, 그렇지 않은 경우 size() 에 대해 로그 시간. 추가로 c 에 대한 삽입 비용이 더해집니다.
6) N + M·log ( M ) , 여기서 N 은 연산 전의 size() 이고 M std:: distance ( first, last ) 입니다.
7) size() 의 크기에 대해 로그 시간 복잡도를 가지며, c 에 대한 삽입 비용이 추가됩니다.
8) 선형 복잡도를 가지며, 여기서 N 은 연산 후의 size() 값입니다.
9) N + M·log ( M ) , 여기서 N 은 작업 전의 size() 이고 M ilist. size ( ) 입니다.
10) 연산 후 size() N 에 대해 선형 시간 복잡도를 가짐.

참고 사항

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

예제

#include <cassert>
#include <flat_set>
#include <iostream>
int main()
{
    std::flat_set<int> set;
    auto result_1 = set.insert(3);
    assert(result_1.first != set.end()); // 유효한 반복자입니다
    assert(*result_1.first == 3);
    if (result_1.second)
        std::cout << "insert done\n";
    auto result_2 = set.insert(3);
    assert(result_2.first == result_1.first); // 동일한 반복자
    assert(*result_2.first == 3);
    if (!result_2.second)
        std::cout << "no insertion\n";
}

출력:

insert done
no insertion

참고 항목

제자리에서 요소를 생성
(public member function)
힌트를 사용하여 제자리에서 요소들을 생성
(public member function)
인수에서 추론된 타입의 std::insert_iterator 를 생성
(function template)