map_extract
map_extract (std::map::extract — 노드 추출)
std::map에서 노드를 분리해 노드 핸들(node handle)로 반환하는 멤버 함수예요. 노드 핸들은 같은 비교자·할당자를 가진 다른 연관 컨테이너로 이식될 수 있어요.
출처: cppreference
본문
시그니처는 다음과 같아요.
node_type extract( const_iterator position ); // (1) (since C++17)
node_type extract( const Key& k ); // (2) (since C++17)
template< class K >
node_type extract( K&& x ); // (3) (since C++23)
(1) position이 가리키는 원소를 담고 있는 노드를 연결에서 떼어내고, 그것을 소유하는 node handle을 반환해요.
(2) 컨테이너에 k와 동등한 키를 가진 원소가 있으면 그 원소를 담고 있는 노드를 컨테이너에서 떼어내고 node handle을 반환해요.
(3) x와 동등 하게 비교되는 키를 가진 원소의 노드를 떼어내요. 이 오버로드는 한정 식별자 Compare::is_transparent가 유효하고 타입을 나타낼 때만 오버로드 해석에 참여해요.
extract는 노드를 재배치(relocate)하는 유일한 방법이라서, 재할당 없는(reallocation-free) 노드 이식을 위해 쓰일 수 있어요. 추출한 노드의 키는 변경할 수 있어요.
매개변수
position: 추출할 유효한 이터레이터k: 추출할 원소의 키x: 키와 투명하게 비교할 수 있는 값 (오버로드 참여 조건 유의)
반환값
추출된 원소를 소유하는 node handle. 원소가 없으면 빈 node handle.
복잡도
(1) 분할 상환 상수. (2,3) log(size()).
예제
#include <iostream>
#include <map>
int main()
{
std::map<int, char> m{{1, 'a'}, {2, 'b'}, {3, 'c'}};
auto nh = m.extract(2); // 2:'b' 노드 추출
nh.key() = 9; // 키 변경
m.insert(std::move(nh)); // 다시 삽입
for (auto& [k, v] : m) std::cout << k << ' '; // 1 3 9
}