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 myuset = std::unordered_set<Key, std::hash<Key>, std::equal_to<Key>, my_alloc<Key>>;
int main()
{
myuset<int> us1{ my_alloc<int>(1) };
myuset<int> us2{ my_alloc<int>(2) };
std::cout << us1.get_allocator().no << ',' << us2.get_allocator().no << std::endl;
swap(us1, us2);
// my_alloc は propagate_on_container_swap を true_type としているので、
// アロケータも swap される。
std::cout << us1.get_allocator().no << ',' << us2.get_allocator().no << std::endl;
us1 = us2;
// my_alloc は propagate_on_container_copy_assignment を true_type としていないので、
// アロケータは copy されない。
std::cout << us1.get_allocator().no << ',' << us2.get_allocator().no << std::endl;
}
出力
1,2
2,1
2,1
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅, 3.1 ✅
- GCC: 4.4.7 ✅, 4.5.3 ✅, 4.6.3 ✅, 4.7.0 ✅
- ICC: ?
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅, 2017 ✅
- 2010は、
noexcept
が修飾されていない。 - 2012, 2013は、
noexcept
が実装されていないため、throw()
が修飾されている。
- 2010は、
備考
libstdc++ の unordered_set
では、アロケータの select_on_container_copy_construction
、propagate_on_container_copy_assignment
、propagate_on_container_move_assignment
、および、propagate_on_container_swap
を正しく扱っていないため、get_allocator
で返されるアロケータオブジェクトは予期せぬものになる可能性がある。
関連項目
名前 | 説明 |
---|---|
(constructor) |
コンストラクタ |
operator= |
代入演算子 |
swap |
内容の交換(非メンバ関数) |
allocator |
デフォルトのアロケータ |
allocator_traits |
アロケータのトレイツ |