Namespaces
Variants

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

From cppreference.net

node_type extract ( const_iterator pos ) ;
(1) (C++17부터)
(C++26부터 constexpr)
node_type extract ( const Key & k ) ;
(2) (C++17부터)
(C++26부터 constexpr)
template < class K >
node_type extract ( K && x ) ;
(3) (C++23부터)
(C++26부터 constexpr)
1) pos 가 가리키는 요소를 포함하는 노드를 연결 해제하고 이를 소유하는 node handle 을 반환합니다.
2,3) 컨테이너에 키가 k 또는 x (C++23부터) 와 동등한 요소가 있으면, 해당 요소를 포함하는 노드를 컨테이너에서 연결 해제하고 이를 소유하는 node handle 을 반환합니다. 그렇지 않으면 빈 node handle을 반환합니다.
3) 이 오버로드는 Compare transparent 이고, iterator const_iterator 모두 K 에서 암시적으로 변환되지 않는 경우에만 오버로드 해결에 참여합니다. 이를 통해 Key 인스턴스를 생성하지 않고 이 함수를 호출할 수 있습니다.

어떤 경우든, 요소들이 복사되거나 이동되지 않으며 컨테이너 노드의 내부 포인터들만 재지정됩니다 ( erase() 에서와 같이 재균형이 발생할 수 있습니다).

노드를 추출하면 추출된 요소에 대한 반복자만 무효화됩니다. 추출된 요소에 대한 포인터와 참조는 유효하게 유지되지만, 요소가 노드 핸들에 의해 소유되는 동안에는 사용할 수 없습니다: 요소가 컨테이너에 삽입되면 사용 가능해집니다.

목차

매개변수

pos - 이 컨테이너의 유효한 반복자
k - 추출할 노드를 식별하는 키
x - 추출할 노드를 식별하는 키와 투명하게 비교될 수 있는 임의 타입의 값

반환값

추출된 요소를 소유하는 node handle 이며, 요소가 (2,3) 에서 발견되지 않을 경우 빈 node handle입니다.

예외

1) 아무것도 던지지 않습니다.
2,3) Compare 객체에 의해 발생하는 모든 예외.

복잡도

1) 분할 상환 상수 시간.
2,3) log( size() )

참고 사항

extract는 이동 전용 객체를 집합에서 꺼내는 유일한 방법입니다:

std::set<move_only_type> s;
s.emplace(...);
move_only_type mot = std::move(s.extract(s.begin()).value());
Feature-test 매크로 표준 기능
__cpp_lib_associative_heterogeneous_erasure 202110L (C++23) 연관 컨테이너 비순차 연관 컨테이너 에서의 이종 삭제, ( 3 )

예제

#include <algorithm>
#include <iostream>
#include <string_view>
#include <set>
void print(std::string_view comment, const auto& data)
{
    std::cout << comment;
    for (auto datum : data)
        std::cout << ' ' << datum;
    std::cout << '\n';
}
int main()
{
    std::set<int> cont{1, 2, 3};
    print("Start:", cont);
    // 노드 핸들 추출 및 키 변경
    auto nh = cont.extract(1);
    nh.value() = 4;
    print("After extract and before insert:", cont);
    // 노드 핸들 다시 삽입
    cont.insert(std::move(nh));
    print("End:", cont);
}

출력:

Start: 1 2 3
After extract and before insert: 2 3
End: 2 3 4

참고 항목

(C++17)
다른 컨테이너로부터 노드를 연결
(public member function)
요소 삽입 또는 노드 (C++17부터)
(public member function)
요소 삭제
(public member function)