- unordered_map[meta header]
- function[meta id-type]
- std[meta namespace]
- unordered_multimap[meta class]
- cpp17[meta cpp]
node_type extract(const_iterator position); (1)
node_type extract(const key_type& x); (2)
(1) position
が指すノードを切り離し、その要素を所有するノードハンドルを返す。
(2) x
と等価なキーが見つかった場合、その要素を所有するノードハンドルを返す。それ以外の場合は空のノードハンドルを返す。
要素を所有するノードハンドル。ただし、オーバーロード(2)の場合は空のノードハンドルの可能性がある。
(1), (2) : 平均的なケースでは定数(O(1
))だが、最悪のケースではコンテナの要素数に比例(O(size
()
))
extract
は、要素に対するコピーもムーブも行わずに、要素の所有権を転送することができる。
また、extract
は再確保なしでマップ要素のキーを変更することができる。
#include <iostream>
#include <unordered_map>
int main()
{
std::unordered_multimap<int, char> m1;
std::unordered_multimap<int, char> m2 = {
{10, 'a'},
{10, 'b'},
{10, 'c'}
};
// ノードを取得
std::unordered_multimap<int, char>::node_type node = m2.extract(10);
// キーを書き換え
node.key() = 15;
// ノードを転送
m1.insert(std::move(node));
std::cout << "m1 :" << std::endl;
for (const auto& [key, value] : m1)
std::cout << "[" << key << ", " << value << "]" << std::endl;
std::cout << "\n" << "m2 :" << std::endl;
for (const auto& [key, value] : m2)
std::cout << "[" << key << ", " << value << "]" << std::endl;
}
- extract[color ff0000]
- node_type[link /reference/node_handle/node_handle.md]
- key[link /reference/node_handle/node_handle/key.md]
m1 :
[15, c]
m2 :
[10, b]
[10, a]
- C++17
- Clang: 7.0.0 [mark verified]
- GCC: 7.1.0 [mark verified]
- ICC: ??
- Visual C++: 2017 Update 5 [mark verified]