Skip to content

Latest commit

 

History

History
107 lines (76 loc) · 2.59 KB

extract.md

File metadata and controls

107 lines (76 loc) · 2.59 KB

extract

  • map[meta header]
  • function[meta id-type]
  • std[meta namespace]
  • map[meta class]
  • cpp17[meta cpp]
node_type extract(const_iterator position); // (1) C++17

node_type extract(const key_type& x);       // (2) C++17

template <class K>
node_type extract(K&& x);                   // (3) C++23

概要

指定された要素を*thisから切り離し、その要素を所有するノードハンドルを取得する。

  • (1) : positionが指すノードを切り離す
  • (2) : xと等価なキーをもつノードを切り離す
  • (3) : key_typeと比較可能なxと等価なキーをもつノードを切り離す

戻り値

要素を所有するか、空のノードハンドル

計算量

  • (1) : 償却定数時間
  • (2), (3) : 要素数をNとして、log(N)

備考

  • この関数は、要素に対するコピーもムーブも行わずに、要素の所有権を転送することができる
  • この関数は、再確保なしでマップ要素のキーを変更することができる

#include <iostream>
#include <map>

int main()
{
  std::map<int, char> m1;
  std::map<int, char> m2 = {
    {10, 'a'},
    {20, 'b'},
    {30, 'c'}
  };

  // ノードを取得
  std::map<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, a]

m2 :
[20, b]
[30, c]

バージョン

言語

  • C++17

処理系

  • Clang: 7.0.0 [mark verified]
  • GCC: 7.1.0 [mark verified]
  • ICC: ??
  • Visual C++: 2017 Update 5 [mark verified]

関連項目

参照