node-handle
template</* unspecified */> class /*node-handle*/; |
(начиная с C++17) (только для иллюстрации*) |
Дескриптор узла — это объект, который принимает во владение один элемент из ассоциативного контейнера или неупорядоченного ассоциативного контейнера. Его можно использовать для передачи этого владения другому контейнеру с совместимыми узлами.
Дескриптор узла может находиться в одном из двух состояний:
- он ссылается на элемент, извлечённый из контейнера, или
- он пуст .
Если дескриптор узла не пуст, он содержит аллокатор, равный аллокатору контейнера, из которого был извлечён элемент.
Для всех контейнеров map (std::map, std::multimap, std::unordered_map и std::unordered_multimap), у которых key_type — Key, а mapped_type — T, поведение операций с дескрипторами узлов не определено, если для std::pair<Key,T> или std::pair<constKey,T> существует определённая пользователем специализация std::pair.
Вложенные типы
| Тип | Определение |
|---|---|
key_type (только для контейнеров map) | ключ, хранящийся в узле |
mapped_type (только для контейнеров map) | отображаемая часть элемента, хранящегося в узле |
value_type (только для контейнеров set) | элемент, хранящийся в узле |
allocator_type | аллокатор, используемый при уничтожении элемента |
container_node_type | не указано (тип-член, приведённый только для иллюстрации*) |
ator_traits |
std::allocator_traits<allocator_type> (тип-член, приведённый только для иллюстрации*) |
Фактические определения вложенных типов, не приведённых только для иллюстрации, см. в требованиях AssociativeContainer и UnorderedAssociativeContainer.
Члены-данные
| Член | Описание |
|---|---|
|
typename | указатель на узел контейнера, содержащий объект, на который выполняется ссылка[1] (объект-член, приведённый только для иллюстрации*) |
std::optional<allocator_type> alloc_ | хранящийся аллокатор (объект-член, приведённый только для иллюстрации*) |
- Владение узлом контейнера, на который указывает указатель, уже было отсоединено от исходного контейнера при извлечении элемента. Даже если время жизни исходного контейнера завершилось, узел контейнера и содержащийся в нём элемент по-прежнему доступны.
Функции-члены
node-handle ::node-handle
constexpr /*node-handle*/() noexcept; | (1) | |
/*node-handle*/( /*node-handle*/&& other ) noexcept; | (2) | (constexpr начиная с C++26) |
other. -
ptr_инициализируется с помощьюother.ptr_. -
alloc_конструируется перемещением с помощьюother.alloc_. - Присваивает
nullptrзначениеother.ptr_. - Присваивает
std::nulloptзначениеother.ptr_.
Параметры
| other | - | другой дескриптор узла |
Примечания
Пользовательский деструктор копирования отсутствует. node-handle не удовлетворяет требованиям CopyConstructible.
Помимо конструирования перемещением и присваивания перемещением, непустой node-handle можно создать только вызовом функций-членов extract ассоциативных (в том числе неупорядоченных) контейнеров.
node-handle ::operator=
/*node-handle*/& operator=( /*node-handle*/&& other ); | (constexpr начиная с C++26) |
Оператор присваивания перемещением заменяет состояние *this состоянием other, используя семантику перемещения.
- Если
ptr_ != nullptr—true, уничтожает элемент, на который ссылается*this, вызываяator_traits::destroy, а затем освобождает память, выделенную для указанного элемента, вызываяator_traits::rebind_traits<container-node-type>::deallocate. - Присваивает
other.ptr_значениеptr_. - Если
ator_traits ::propagate_on_container_move_assignment—true, присваивает перемещениемother.alloc_значениеalloc_. - Присваивает
nullptrзначениеother.ptr_, аstd::nullopt— значениеother.alloc_.
Если все следующие значения равны false, поведение не определено:
ator_traits ::propagate_on_container_move_assignment!alloc_alloc_ == other.alloc_
Параметры
| other | - | другой дескриптор узла |
Возвращаемое значение
*this
Исключения
Не выбрасывает исключений.
Примечания
Пользовательский оператор присваивания копированием отсутствует. node-handle не удовлетворяет требованиям CopyAssignable.
node-handle ::~node-handle
~/*node-handle*/(); | (constexpr начиная с C++26) |
Если ptr_ != nullptr — true, уничтожает элемент, на который ссылается *this, вызывая ator_traits ::destroy, а затем освобождает память элемента контейнера, вызывая ator_traits ::rebind_traits<container-node-type >::deallocate.
В противном случае ничего не делает.
node-handle ::empty
bool empty() const noexcept; | (constexpr начиная с C++26) |
Возвращает true, если дескриптор узла пуст, и false в противном случае.
Возвращаемое значение
ptr_ == nullptr
node-handle ::operator bool
explicit operator bool() const noexcept; | (constexpr начиная с C++26) |
Преобразуется в false, если дескриптор узла пуст, и в true в противном случае.
Возвращаемое значение
ptr_ != nullptr
node-handle ::get_allocator
allocator_type get_allocator() const; | (constexpr начиная с C++26) |
Возвращает копию хранящегося аллокатора.
Если empty() — true, поведение не определено.
Возвращаемое значение
*alloc_
Исключения
Не выбрасывает исключений.
node-handle ::value (только для контейнеров set)
value_type& value() const; | (constexpr начиная с C++26) |
Возвращает ссылку на элемент, на который ссылается *this.
Если empty() — true, поведение не определено.
Возвращаемое значение
Как описано выше.
Исключения
Не выбрасывает исключений.
node-handle ::key (только для контейнеров map)
key_type& key() const; | (constexpr начиная с C++26) |
Возвращает неконстантную ссылку на член key_type элемента, на который ссылается *this.
Если empty() — true, поведение не определено.
Возвращаемое значение
Как описано выше.
Исключения
Не выбрасывает исключений.
Примечания
Эта функция позволяет изменить ключ узла, извлечённого из map, а затем снова вставить его в map, не копируя и не перемещая элемент.
node-handle ::mapped (только для контейнеров map)
mapped_type& mapped() const; | (constexpr начиная с C++26) |
Возвращает ссылку на член mapped_type элемента, на который ссылается *this.
Если empty() — true, поведение не определено.
Возвращаемое значение
Как описано выше.
Исключения
Не выбрасывает исключений.
node-handle ::swap
void swap( /*node-handle*/& other ) noexcept(/* see below */); | (constexpr начиная с C++26) |
Вызывает swap(ptr_ , nh.ptr_ ). Если какое-либо из следующих значений равно true, также вызывает swap(alloc_ , nh.alloc_ ):
ator_traits ::propagate_on_container_swap!alloc_!other.alloc_
Если все следующие значения равны false, поведение не определено:
ator_traits ::propagate_on_container_swap!alloc_!other.alloc_alloc_ == other.alloc_
Исключения
noexcept: noexcept(ator_traits::propagate_on_container_swap::value ||
ator_traits::is_always_equal::value)
Функции, не являющиеся членами
std::swap(node-handle )
friend void swap(/*node-handle*/& lhs, /*node-handle*/& rhs)
noexcept(noexcept(lhs.swap(rhs)));
| (constexpr начиная с C++26) |
По существу, выполняет x.swap(y).
Эта функция не видна при обычном неквалифицированном поиске или квалифицированном поиске и может быть найдена только с помощью поиска, зависящего от аргументов, если node-handle является ассоциированным классом аргументов.
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/node_handle