Namespaces
Variants

std::set<Key,Compare,Allocator>:: insert

From cppreference.net
std:: pair < iterator, bool > insert ( const value_type & value ) ;
(1) (constexpr since C++26)
std:: pair < iterator, bool > insert ( value_type && value ) ;
(2) (since C++11)
(constexpr since C++26)
(3)
iterator insert ( iterator pos, const value_type & value ) ;
(until C++11)
iterator insert ( const_iterator pos, const value_type & value ) ;
(since C++11)
(constexpr since C++26)
iterator insert ( const_iterator pos, value_type && value ) ;
(4) (since C++11)
(constexpr since C++26)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(5) (constexpr since C++26)
void insert ( std:: initializer_list < value_type > ilist ) ;
(6) (since C++11)
(constexpr since C++26)
insert_return_type insert ( node_type && nh ) ;
(7) (since C++17)
(constexpr since C++26)
iterator insert ( const_iterator pos, node_type && nh ) ;
(8) (since C++17)
(constexpr since C++26)
template < class K >
std:: pair < iterator, bool > insert ( K && x ) ;
(9) (since C++23)
(constexpr since C++26)
template < class K >
iterator insert ( const_iterator pos, K && x ) ;
(10) (since C++23)
(constexpr since C++26)

요소를 * this 에 삽입하려고 시도합니다.

  • 만약 * this 가 이미 동등한 키를 가진 요소를 포함하고 있다면, 아무 작업도 수행하지 않습니다.
  • 그렇지 않으면, 요소를 * this 에 삽입합니다.
1-4) value 를 삽입합니다. pos 가 제공된 경우, value pos 바로 앞 위치에 가능한 한 가깝게 삽입됩니다.
1,3) value_type set 에 대해 CopyInsertable 가 아닌 경우, 동작은 정의되지 않습니다.
2,4) value_type set 에 대해 MoveInsertable 가 아닌 경우, 동작은 정의되지 않습니다.
(since C++11)
5) 범위 [ first , last ) 에서 요소들을 삽입합니다.
다음 조건 중 하나라도 충족되면 동작은 정의되지 않습니다:
(C++11부터)
  • first 또는 last * this 의 반복자인 경우.
6) 초기화자 목록으로부터 요소들을 삽입합니다 ilist .
다음에 해당함: insert ( ilist. begin ( ) , ilist. end ( ) ) .
7) 만약 nh 가 빈 node handle 이면, 아무 작업도 수행하지 않습니다. 그렇지 않으면, nh. key ( ) 와 동등한 키를 가진 요소가 컨테이너에 이미 존재하지 않는 경우에 한해, nh 가 소유한 요소를 컨테이너에 삽입합니다. nh 가 비어 있지 않고 get_allocator ( ) ! = nh. get_allocator ( ) 인 경우의 동작은 정의되지 않습니다.
8) 만약 nh 가 빈 node handle 이면, 아무 작업도 수행하지 않고 end iterator를 반환합니다. 그렇지 않으면, nh 가 소유한 요소를 컨테이너에 삽입합니다. 단, 컨테이너가 이미 nh. key ( ) 와 동등한 키를 가진 요소를 포함하고 있지 않은 경우에 한합니다. 그리고 nh. key ( ) 와 동등한 키를 가진 요소를 가리키는 iterator를 반환합니다(삽입이 성공했는지 실패했는지에 관계없이). 삽입이 성공하면, nh 는 이동(moved from)되고, 그렇지 않으면 요소의 소유권을 유지합니다. 요소는 pos 바로 앞 위치에 가능한 한 가깝게 삽입됩니다. 만약 nh 가 비어 있지 않고 get_allocator ( ) ! = nh. get_allocator ( ) 인 경우, 동작은 정의되지 않습니다.
9,10) value_type 타입의 객체 u std:: forward < K > ( x ) 로 생성한 다음 u * this 에 삽입합니다. 동등한 키의 존재 여부는 u 를 생성하기 전에 x 를 사용하여 투명하게 결정됩니다.
다음 조건 중 하나라도 만족되면, 동작은 정의되지 않음:
  • value_type 이(가) EmplaceConstructible 으로 set std:: forward < K > ( x ) 로부터 생성 가능하지 않은 경우.
  • equal_range ( u ) == equal_range ( x ) false 인 경우.
9) 이 오버로드는 Compare transparent 인 경우에만 오버로드 해결에 참여합니다.
10) u pos 바로 앞 위치에 최대한 가깝게 삽입됩니다.
이 오버로드는 다음의 모든 조건이 만족될 때만 오버로드 해결에 참여합니다:

반복자나 참조는 무효화되지 않습니다. 삽입이 성공한 경우, 노드 핸들에 보관된 동안 획득한 해당 요소에 대한 포인터와 참조는 무효화되며, 추출되기 전에 해당 요소에 대해 획득한 포인터와 참조는 유효해집니다. (C++17부터)

목차

매개변수

pos - 새로운 요소가 삽입될 위치 앞을 가리키는 반복자
value - 삽입할 요소 값
first, last - 삽입할 요소들의 소스 범위 를 정의하는 한 쌍의 반복자
ilist - 값을 삽입할 초기화 리스트
nh - 호환되는 노드 핸들
x - 키와 투명하게 비교될 수 있는 임의 타입의 값
타입 요구사항
-
InputIt LegacyInputIterator 요구사항을 충족해야 함.

반환값

1,2) 삽입된 요소(또는 삽입을 방해한 요소)에 대한 반복자와 삽입이 발생한 경우에만 bool 값이 true 로 설정된 쌍입니다.
3,4) 삽입된 요소에 대한 반복자, 또는 삽입을 방해한 요소에 대한 반복자.
7) 다음과 같이 초기화된 멤버들을 가진 insert_return_type 객체:
  • 만약 nh 가 비어있다면, inserted false , position end ( ) 이며, node 는 비어 있습니다.
  • 그렇지 않고 삽입이 발생했다면, inserted true , position 은 삽입된 요소를 가리키며, node 는 비어 있습니다.
  • 만약 삽입이 실패했다면, inserted false , node nh 의 이전 값을 가지며, position nh. key ( ) 에 해당하는 키를 가진 요소를 가리킵니다.
8) 만약 nh 가 비어 있었다면 end iterator, 삽입이 발생했다면 삽입된 요소를 가리키는 iterator, 실패했다면 nh. key ( ) 와 동등한 키를 가진 요소를 가리키는 iterator.
9) 삽입된 요소(또는 삽입을 방해한 요소)에 대한 반복자와, 삽입이 발생한 경우에만 bool 값이 true 로 설정된 한 쌍.
10) 삽입된 요소 또는 삽입을 방해한 요소에 대한 반복자.

예외

단일 요소 삽입 과정 중 어떤 연산에서 예외가 발생하면, 삽입은 아무런 효과를 가지지 않습니다.

복잡도

주어진 N size ( ) 로:

1,2) log(N)
3,4) 삽입이 바로 다음 위치에서 (C++11 이전) 바로 앞 위치에서 (C++11 이후) pos 에 발생하는 경우 분할 상환 상수 시간, log(N) 그 외의 경우.
5,6) log(N+M) , 여기서 M 은 삽입할 요소의 개수입니다.
7) log(N)
8) 삽입이 pos 바로 앞 위치에서 발생하는 경우 분할 상환 상수 시간, log(N) 그 외의 경우.
9) log(N)
10) 삽입이 pos 바로 앞 위치에서 발생하는 경우 분할 상환 상수 시간, log(N) 그 외의 경우.

참고 사항

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

오버로드 ( 5,6 ) 는 일반적으로 힌트로 end() 를 사용하여 오버로드 ( 3 ) 를 호출하는 루프로 구현됩니다; 이들은 정렬된 시퀀스(예: 다른 std::set )의 가장 작은 요소가 * this 의 마지막 요소보다 큰 경우에 대한 추가 작업에 최적화되어 있습니다.

범위 내에 비교 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 지정되지 않습니다 (보류 중인 LWG2844 ).

Feature-test 매크로 표준 기능
__cpp_lib_associative_heterogeneous_insertion 202311L (C++26) 정렬된 비정렬 연관 컨테이너 에서 남아있는 멤버 함수들에 대한 이종(heterogeneous) 오버로드. ( 9,10 )

예제

#include <cassert>
#include <iostream>
#include <set>
int main()
{
    std::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

결함 보고서

다음 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 233 C++98 pos 가 단순 힌트였으며 완전히 무시될 수 있었음 삽입은 pos 바로 이전 위치에
가능한 한 가깝게
수행되어야 함
LWG 264 C++98 오버로드 ( 5 ) 의 복잡도는 범위 [ first , last ) Compare 에 따라 정렬된 경우
선형으로 요구되었음
이 특별한 경우에 대한
선형 요구사항 제거
LWG 316 C++98 오버로드 ( 1 ) 의 반환 값에서
어떤 bool 값이 성공적인 삽입을
나타내는지 명시되지 않았음
성공은 true 로 표시됨

참고 항목

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