Namespaces
Variants

std::multimap<Key,T,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부터) 와 동등한 요소가 있으면, 해당 요소를 포함하는 첫 번째 노드를 컨테이너에서 분리(unlink)하고 이를 소유하는 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::map<int, std::string> m{{1, "mango"}, {2, "papaya"}, {3, "guava"}};
auto nh = m.extract(2);
nh.key() = 4;
m.insert(std::move(nh));
// m == {{1, "망고"}, {3, "구아바"}, {4, "파파야"}}
Feature-test 매크로 표준 기능
__cpp_lib_associative_heterogeneous_erasure 202110L (C++23) 연관 컨테이너 및 비순차 연관 컨테이너에서의 이종 삭제 , ( 3 )

예제

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

출력:

Start: 1(a) 2(b) 3(c)
After extract and before insert: 2(b) 3(c)
End: 2(b) 3(c) 4(a)

참고 항목

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