Namespaces
Variants

std::unordered_set<Key,Hash,KeyEqual,Allocator>:: insert

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

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

1,2) value 를 삽입합니다.
3,4) value 를 삽입하며, 검색을 시작할 위치에 대한 비구속적 제안으로 hint 를 사용합니다.
5) 범위 [ first , last ) 에서 요소들을 삽입합니다. 범위 내에 비교 시 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 명시되지 않습니다 (보류 중인 LWG2844 ).
6) 초기화자 목록 ilist 에서 요소들을 삽입합니다. 범위 내에서 키가 동등하게 비교되는 여러 요소가 있는 경우, 어떤 요소가 삽입될지 지정되지 않습니다 (보류 중인 LWG2844 ).
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). 그렇지 않으면 요소의 소유권을 유지합니다. hint 는 검색을 시작할 위치에 대한 비구속적 제안으로 사용됩니다. nh 가 비어 있지 않고 get_allocator ( ) ! = nh. get_allocator ( ) 인 경우의 동작은 정의되지 않습니다.
9) 만약 * this 가 이미 투명하게 비교 시 동등한 요소를 포함하고 있다면, 아무 작업도 수행하지 않습니다. 그렇지 않으면, value_type 의 객체 u std:: forward < K > ( obj ) 로 생성한 후 u * this 에 삽입합니다. 만약 equal_range ( u ) ! = hash_function ( ) ( obj ) || contains ( u ) true 라면, 동작은 정의되지 않습니다. value_type std:: forward < K > ( obj ) 로부터 unordered_set 안으로 EmplaceConstructible 되어야 합니다. 이 오버로드는 Hash KeyEqual 이 모두 transparent 일 때만 오버로드 해결에 참여합니다. 이는 해당 Hash K Key 타입 모두에 대해 호출 가능하고, KeyEqual 이 투명하다는 것을 가정하며, 이를 통해 Key 의 인스턴스를 생성하지 않고도 이 함수를 호출할 수 있게 합니다.
10) 만약 * this 가 이미 투명하게 비교 시 동등 한 요소를 포함하고 있다면, 아무 작업도 수행하지 않습니다.

그렇지 않으면, value_type 타입의 객체 u std:: forward < K > ( obj ) 로 생성한 후 u * this 에 삽입합니다. Template:hint 은 검색을 시작할 위치에 대한 비구속적 제안으로 사용됩니다. 만약 equal_range ( u ) ! = hash_function ( ) ( obj ) || contains ( u ) true 라면, 동작은 정의되지 않습니다. value_type std:: forward < K > ( obj ) 로부터 unordered_set 안으로 EmplaceConstructible 되어야 합니다. 이 오버로드는 다음 조건에서만 오버로드 해결에 참여합니다:

  • std:: is_convertible_v < K && , const_iterator > std:: is_convertible_v < K && , iterator > 가 모두 false 이고,
  • Hash :: is_transparent KeyEqual :: is_transparent 가 유효하며 각각 타입을 나타내는 경우입니다. 이는 해당 Hash K Key 타입 모두에 대해 호출 가능하고, KeyEqual 이 투명하다는 것을 가정합니다,
이는 함께 작용하여 Key 의 인스턴스를 생성하지 않고도 이 함수를 호출할 수 있도록 합니다.

만약 연산 후 새로운 원소의 개수가 기존 max_load_factor() * bucket_count() 보다 크면 재해싱이 발생합니다.
재해싱이 발생하는 경우(삽입으로 인해), 모든 반복자는 무효화됩니다. 그렇지 않은 경우(재해싱 없음), 반복자는 무효화되지 않습니다. 삽입이 성공하면, 노드 핸들에 보관되는 동안 획득한 해당 원소에 대한 포인터와 참조는 무효화되며, 추출되기 전에 해당 원소에 대해 획득한 포인터와 참조는 유효해집니다. (C++17부터)

목차

매개변수

hint - 삽입 위치에 대한 제안으로 사용되는 반복자
value - 삽입할 요소 값
first, last - 삽입할 요소들의 소스 범위 를 정의하는 반복자 쌍
ilist - 값을 삽입할 초기화 리스트
nh - 호환 가능한 노드 핸들
obj - 키와 투명하게 비교될 수 있는 임의 타입의 값
타입 요구사항
-
InputIt LegacyInputIterator 요구사항을 충족해야 합니다.

반환값

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

예외

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

복잡도

1-4) 평균적인 경우: O(1) , 최악의 경우 O(size()) .
5,6) 평균적인 경우: O(N) , 여기서 N은 삽입할 원소의 개수입니다. 최악의 경우: O(N * size() + N) .
7-10) 평균적인 경우: O(1) , 최악의 경우 O(size()) .

참고 사항

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

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

예제

#include <array>
#include <iostream>
#include <unordered_set>
std::ostream& operator<<(std::ostream& os, std::unordered_set<int> const& s)
{
    for (os << '[' << s.size() << "] { "; int i : s)
        os << i << ' ';
    return os << "}\n";
}
int main ()
{
    std::unordered_set<int> nums{2, 3, 4};
    std::cout << "1) Initially: " << nums << std::boolalpha;
    auto p = nums.insert(1); // 요소 삽입, 오버로드 (1)
    std::cout << "2) '1' was inserted: " << p.second << '\n';
    std::cout << "3) After insertion: " << nums;
    nums.insert(p.first, 0); // 힌트와 함께 삽입, 오버로드 (3)
    std::cout << "4) After insertion: " << nums;
    std::array<int, 4> a = {10, 11, 12, 13};
    nums.insert(a.begin(), a.end()); // 범위 삽입, 오버로드 (5)
    std::cout << "5) After insertion: " << nums;
    nums.insert({20, 21, 22, 23}); // initializer_list 삽입, (6)
    std::cout << "6) After insertion: " << nums;
    std::unordered_set<int> other_nums = {42, 43};
    auto node = other_nums.extract(other_nums.find(42));
    nums.insert(std::move(node)); // 노드 삽입, 오버로드 (7)
    std::cout << "7) After insertion: " << nums;
    node = other_nums.extract(other_nums.find(43));
    nums.insert(nums.begin(), std::move(node)); // 힌트와 함께 노드 삽입, (8)
    std::cout << "8) After insertion: " << nums;
}

가능한 출력:

1) Initially: [3] { 4 3 2 }
2) '1' was inserted: true
3) After insertion: [4] { 1 2 3 4 }
4) After insertion: [5] { 0 1 2 3 4 }
5) After insertion: [9] { 13 12 11 10 4 3 2 1 0 }
6) After insertion: [13] { 23 22 13 12 11 10 21 4 20 3 2 1 0 }
7) After insertion: [14] { 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }
8) After insertion: [15] { 43 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }

참고 항목

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