template<unspecified>
class node_handle;
概要
クラスnode_handleの名前は未規定だが、説明のために名前node_handleを用いる。
ノードハンドルは、連想コンテナstd::set、std::multiset、std::map、std::multimapまたはunordered連想コンテナstd::unordered_set、std::unordered_multiset、std::unordered_map、std::unordered_multimapから単一要素の所有権を受け取るオブジェクトである。
互換性のあるノードを持つ別のコンテナにその所有権を移すために使用される。 互換性のあるノードを持つコンテナは、同じノードハンドル型を持つ。
要素は、次の表の同じ行にあるコンテナ型間でどちらの方向にも転送できる。
map<K, T, C1, A> |
map<K, T, C2, A> |
map<K, T, C1, A> |
multimap<K, T, C2, A> |
set<K, C1, A> |
set<K, C2, A> |
set<K, C1, A> |
multiset<K, C2, A> |
unordered_map<K, T, H1, E1, A> |
unordered_map<K, T, H2, E2, A> |
unordered_map<K, T, H1, E1, A> |
unordered_multimap<K, T, H2, E2, A> |
unordered_set<K, H1, E1, A> |
unordered_set<K, H2, E2, A> |
unordered_set<K, H1, E1, A> |
unordered_multiset<K, H2, E2, A> |
ノードハンドルが空でない場合は、要素が抽出されたときのコンテナのアロケータと等しいアロケータが含まれる。ノードハンドルが空の場合、アロケータは含まれない。
key_type を K、 mapped_type を T としたとき、std::pair<K, T>またはstd::pair<const K, T>に対するユーザー定義の特殊化が存在する場合、ノードハンドルを用いる操作は未定義動作を引き起こす。
また、node_handleはムーブオンリーである。
メンバ関数
構築・破棄
| 名前 | 説明 | 対応バージョン |
|---|---|---|
(constructor) |
コンストラクタ | C++17 |
(destructor) |
デストラクタ | C++17 |
operator= |
代入演算子 | C++17 |
オブザーバー
| 名前 | 説明 | 対応バージョン |
|---|---|---|
value(set) |
要素アクセス | C++17 |
key(map) |
キーアクセス | C++17 |
mapped(map) |
値アクセス | C++17 |
get_allocator |
アロケータオブジェクトの取得 | C++17 |
operator bool |
ノードハンドルが空であるかどうかを調べる | C++17 |
empty |
ノードハンドルが空であるかどうかを調べる | C++17 |
変更
| 名前 | 説明 | 対応バージョン |
|---|---|---|
swap |
2つのnode_handleオブジェクトを入れ替える |
C++17 |
メンバ型
| 名前 | 説明 | 対応バージョン |
|---|---|---|
key_type |
テンプレートパラメータ K。 |
C++17 |
value_type(set) |
テンプレートパラメータ K。 |
C++17 |
value_type(map) |
要素の型。std::pair<const K, T>。 |
C++17 |
mapped_type(map) |
値の型。テンプレートパラメータ T。 |
C++17 |
allocator_type |
アロケータの型。 | C++17 |
非メンバ関数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
swap |
2つのnode_handleオブジェクトを入れ替える |
C++17 |
例
#include <iostream>
#include <map>
int main()
{
// char をキー、int を値として扱う連想配列
std::map<char, int> m1, m2;
// m1 へ挿入
m1.insert(std::make_pair('a', 10));
m1.insert(std::make_pair('b', 20));
m1.insert(std::make_pair('c', 30));
// ノードを取得(要素は、コピーもムーブもされない)
// なお、node_type は node_handle の特殊化である
std::map<char, int>::node_type node = m1.extract('c');
// m2 へ挿入(要素は、コピーもムーブもされない)
m2.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;
}
出力
m1 :
[a, 10]
[b, 20]
m2 :
[c, 30]
バージョン
言語
- C++17
処理系
- Clang: 7.0.0 ✅
- GCC: 7.1.0 ✅
- ICC: ??
- Visual C++: 2017 Update 5 ✅
関連項目
std::setstd::multisetstd::mapstd::multimapstd::unordered_setstd::unordered_multisetstd::unordered_mapstd::unordered_multimap