• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <map>

    std::multimap::extract

    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と等価なキーをもつノードをすべて切り離す

    戻り値

    要素を所有するノードハンドル。ただし、オーバーロード(2), (3)の場合は空のノードハンドルの可能性がある。

    計算量

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

    備考

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

    #include <iostream>
    #include <map>
    
    int main()
    {
      std::multimap<int, char> m1;
      std::multimap<int, char> m2 = {
        {10, 'a'},
        {10, 'b'},
        {10, 'c'}
      };
    
      // ノードを取得
      std::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;
    }
    

    出力

    m1 :
    [15, a]
    
    m2 :
    [10, b]
    [10, c]
    

    バージョン

    言語

    • C++17

    処理系

    関連項目

    参照