最終更新日時:
が更新

履歴 編集

function
<unordered_set>

std::unordered_set::swap(C++11)

void swap(unordered_set& v);

概要

コンテナの内容を交換する。

要件

コンテナの key_equalhasher のオブジェクト(それぞれ key_eq()hash_function() が返すオブジェクト)は、交換可能(swappable)でなければならない。

効果

当該コンテナと引数で渡されたコンテナの内容を交換する。

(計算量が示すように)個々の要素それぞれに対するコピー、ムーブ、交換は行われない。

また、コンテナの key_equalhasher のオブジェクト(それぞれ key_eq()hash_function() が返すオブジェクト)も非メンバ関数 swap を非修飾で(つまり std:: を付けずに)呼び出すことで交換される。(したがって、swap の呼び出しには ADL が働く。)

もし、std::allocator_traits<allocator_type>::propagate_on_container_swap::valuetrue であれば、アロケータオブジェクト(get_allocator() が返すオブジェクト)も非メンバ関数 swap を非修飾で呼び出すことで交換される。そうでなければアロケータオブジェクトは交換されず、その場合、当該コンテナと引数 v がそれぞれ get_allocator() で返すオブジェクトが等価でない(operator==true を返さない)場合、振る舞いは未定義(undefined)である。

戻り値

なし

例外

コンテナの key_equal と hasher のオブジェクト(それぞれ key_eq()hash_function() が返すオブジェクト)の swap() が例外を投げなければ、例外を投げない。

計算量

定数

備考

交換されたコンテナの要素を指す参照、ポインタ、および、イテレータはいずれも無効とはならずに、元の要素を指し続ける(つまり、それらの指すコンテナは入れ替わる)。なお、end() は要素を指さないため、無効になるかもしれない。

#include <iostream>
#include <unordered_set>
#include <iterator>
#include <algorithm>

template <class C>
void print(const char* label, const C& c, std::ostream& os = std::cout)
{
  os << label << " : ";
  std::copy(c.cbegin(), c.cend(), std::ostream_iterator<typename C::value_type>(os, " "));
  os << '\n';
}

int main()
{
  std::unordered_set<int> us1{ 1, 3, 5, 7, 9, };
  std::unordered_set<int> us2{ 0, 2, 4, 6, 8, };

  print("us1 before", us1);
  print("us2 before", us2);
  std::cout << std::endl;

  us1.swap(us2);

  print("us1 after", us1);
  print("us2 after", us2);
}

出力

us1 before : 9 7 5 3 1 
us2 before : 8 6 4 2 0 

us1 after : 8 6 4 2 0 
us2 after : 9 7 5 3 1 

注:unordered_set は非順序連想コンテナであるため、出力順序は無意味であることに注意

バージョン

言語

  • C++11

処理系

参照

swap 内容の交換(非メンバ関数)
emplace コンテナ内への要素の直接構築
emplace_hint 挿入位置のヒントを使用したコンテナ内への要素の直接構築
insert 要素の追加
erase 要素の削除
clear 全要素の削除