最終更新日時: 2026年07月22日 16時08分23秒 (JST)
rotarymars が更新

履歴 編集

function template
<unordered_map>

# std::swap (非メンバ関数)(C++11)

    namespace std {
      template <class Key, class T, class Hash, class Pred, class Alloc>
      void
        swap(unordered_multimap<Key,T,Hash,Pred,Alloc>& x,
             unordered_multimap<Key,T,Hash,Pred,Alloc>& y); // (1) C++11
      template <class Key, class T, class Hash, class Pred, class Alloc>
      void
        swap(unordered_multimap<Key,T,Hash,Pred,Alloc>& x,
             unordered_multimap<Key,T,Hash,Pred,Alloc>& y)
          noexcept(noexcept(x.swap(y)));                    // (1) C++17
      template <class Key, class T, class Hash, class Pred, class Alloc>
      constexpr void
        swap(unordered_multimap<Key,T,Hash,Pred,Alloc>& x,
             unordered_multimap<Key,T,Hash,Pred,Alloc>& y)
          noexcept(noexcept(x.swap(y)));                    // (1) C++26
    }

## 概要

2つの `unordered_multimap` オブジェクトである `x` と `y` が保持するコンテンツを交換する。サイズは異なる場合もある。

このメンバ関数の呼び出しの後、呼び出し前に `x` にあった要素は `y` へ、`y` 内にあった要素は `x` へ移る。全てのイテレータ、参照、ポインタは有効なまま残る。

## 効果

`x.swap(y);`

## 戻り値

なし

## 例外

投げない。

## 計算量

定数時間

## 例

    #include <iostream>
    #include <unordered_map>
    #include <utility>

    template <class Map>
    void print(const char* name, const Map& m)
    {
      std::cout << name << " : {";
      for (const auto& x : m) {
        std::cout << "[" << x.first << "," << x.second << "], ";
      }
      std::cout << "}" << std::endl;
    }

    int main()
    {
      std::unordered_multimap<int, char> um1;
      um1.insert(std::make_pair(10,'a'));
      um1.insert(std::make_pair(20,'b'));
      um1.insert(std::make_pair(30,'c'));
      um1.insert(std::make_pair(30,'d'));
      um1.insert(std::make_pair(30,'e'));

      std::unordered_multimap<int, char> um2;
      um2.insert(std::make_pair(5,'d'));
      um2.insert(std::make_pair(15,'e'));

      // um1とum2を入れ替える
      std::swap(um1, um2);

      ::print("um1", um1);
      ::print("um2", um2);
    }

### 出力例

    um1 : {[5,d], [15,e], }
    um2 : {[10,a], [20,b], [30,c], [30,d], [30,e], }

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: 2012 ✅

## 参照

- N4258 Cleaning-up noexcept in the Library, Rev 3
  - `noexcept` 追加の経緯となる提案文書
- P3372R3 constexpr containers and adaptors