std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>:: extract
From cppreference.net
<
cpp
|
container
|
unordered multimap
|
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) |
2,3)
컨테이너에 키가
k
또는
x
(C++23부터)
와 동등한 요소가 있으면, 해당 요소를 포함하는 첫 번째 노드를 컨테이너에서 분리하고 이를 소유하는
node handle
을 반환합니다. 그렇지 않으면 빈 node handle을 반환합니다.
3)
이 오버로드는 다음 조건에서만 오버로드 해결에 참여합니다:
Hash
와
KeyEqual
이 모두
transparent
이고,
iterator
와
const_iterator
모두
K
에서 암시적으로 변환될 수 없는 경우입니다. 이는 해당
Hash
가
K
와
Key
타입 모두에 대해 호출 가능하고,
KeyEqual
이 transparent임을 가정하며, 이를 통해
Key
의 인스턴스를 생성하지 않고도 이 함수를 호출할 수 있습니다.
어떤 경우든 요소들이 복사되거나 이동하지 않으며, 컨테이너 노드들의 내부 포인터들만 재지정됩니다.
노드를 추출하는 것은 추출된 요소에 대한 반복자만 무효화하며, 삭제되지 않은 요소들의 상대적 순서는 보존합니다. 추출된 요소에 대한 포인터와 참조는 유효하게 유지되지만, 요소가 노드 핸들에 의해 소유되는 동안에는 사용할 수 없습니다: 요소가 컨테이너에 삽입되면 사용 가능해집니다.
목차 |
매개변수
| pos | - | 이 컨테이너의 유효한 반복자 |
| k | - | 추출할 노드를 식별하는 키 |
| x | - | 추출할 노드를 식별하는 키와 투명하게 비교될 수 있는 임의 타입의 값 |
반환값
추출된 요소를 소유하는 node handle 이며, 요소가 (2,3) 에서 발견되지 않을 경우 빈 node handle입니다.
예외
1)
아무것도 던지지 않습니다.
2,3)
Hash
및
KeyEqual
객체에 의해 발생하는 모든 예외.
복잡도
1-3)
평균 케이스 O(1), 최악 케이스 O(
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, "mango"}, {3, "guava"}, {4, "papaya"}}
| Feature-test 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_erasure
|
202110L
|
(C++23) | 연관 컨테이너와 비순차 연관 컨테이너에서의 연관 컨테이너 및 비순차 연관 컨테이너 의 이종 삭제, ( 3 ) |
예제
이 코드 실행
#include <algorithm> #include <iostream> #include <string_view> #include <unordered_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::unordered_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) |