最終更新日時:
が更新

履歴 編集

function
<unordered_set>

std::unordered_multiset::get_allocator(C++11)

allocator_type get_allocator() const noexcept;

概要

このコンテナで使用されているアロケータオブジェクトを返す。

戻り値

このコンテナで使用されているアロケータオブジェクト

例外

投げない

計算量

定数

#include <iostream>
#include <memory>
#include <unordered_set>
#include <type_traits>

template <class T>
struct my_alloc {
  using value_type = T;
  T* allocate(std::size_t n) { return static_cast<T*>(::operator new(sizeof(T) * n)); }
  void deallocate(T* p, std::size_t) noexcept { ::operator delete(static_cast<void*>(p)); }
  template <class U>
  my_alloc(const my_alloc<U>& b) noexcept : no(b.no) { }
  explicit my_alloc(const int _no) : no(_no) { }
  int no;
  using propagate_on_container_swap = std::true_type;
};

template <class T1, class T2>
bool operator==(const my_alloc<T1>& a1, const my_alloc<T2>& a2) noexcept
{
  return a1.no == a2.no;
}

template <class T1, class T2>
bool operator!=(const my_alloc<T1>& a1, const my_alloc<T2>& a2) noexcept
{
  return a1.no != a2.no;
}

template <class Key>
using myumset = std::unordered_multiset<Key, std::hash<Key>, std::equal_to<Key>, my_alloc<Key>>;

int main()
{
  myumset<int> um1{ my_alloc<int>(1) };
  myumset<int> um2{ my_alloc<int>(2) };

  std::cout << um1.get_allocator().no << ',' << um2.get_allocator().no << std::endl;
  swap(um1, um2);

  // my_alloc は propagate_on_container_swap を true_type としているので、
  // アロケータも swap される。
  std::cout << um1.get_allocator().no << ',' << um2.get_allocator().no << std::endl;
  um1 = um2;

  // my_alloc は propagate_on_container_copy_assignment を true_type としていないので、
  // アロケータは copy されない。
  std::cout << um1.get_allocator().no << ',' << um2.get_allocator().no << std::endl;
}

出力

1,2
2,1
2,1

バージョン

言語

  • C++11

処理系

  • Clang: -
  • Clang, C++11 mode: 3.0, 3.1
  • GCC: -
  • GCC, C++11 mode: 4.4.7, 4.5.3, 4.6.3, 4.7.0
  • ICC: ?
  • Visual C++: 10.0, 11.0, 12.0, 14.0, 14.1
    • 10.0は、noexceptが修飾されていない。
    • 11.0, 12.0は、noexceptが実装されていないため、throw()が修飾されている。

備考

libstdc++ の unordered_multiset では、アロケータの select_on_container_copy_constructionpropagate_on_container_copy_assignmentpropagate_on_container_move_assignment、および、propagate_on_container_swap を正しく扱っていないため、get_allocator で返されるアロケータオブジェクトは予期せぬものになる可能性がある。

参照

(constructor) コンストラクタ
operator= 代入演算子
swap 内容の交換(非メンバ関数)
allocator デフォルトのアロケータ
allocator_traits アロケータのトレイツ