Namespaces
Variants

node-handle

From cppreference.net
template < /* unspecified */ >
class /*node-handle*/ ;
(начиная с C++17)
( только для демонстрации* )

node handle — это объект, который принимает владение одним элементом из ассоциативных контейнеров и неупорядоченных ассоциативных контейнеров . Он может быть использован для передачи этого владения другому контейнеру с совместимыми узлами.

Дескриптор узла имеет два возможных состояния:

  • Это ссылается на элемент, извлеченный из контейнера, или
  • он является пустым  .

Если дескриптор узла не пуст, то он содержит аллокатор, который равен аллокатору контейнера, из которого был извлечен узел.

Для всех контейнеров-ассоциативных массивов ( std::map , std::multimap , std::unordered_map и std::unordered_multimap ), у которых key_type является Key , а mapped_type является T , поведение операций с node handles не определено, если существует пользовательская специализация std::pair для std:: pair < Key, T > или std:: pair < const Key, T > .

Содержание

Вложенные типы

Тип Определение
key_type (только для контейнеров map) ключ, хранящийся в узле
mapped_type (только для контейнеров map) отображаемая часть элемента, хранящегося в узле
value_type (только для контейнеров set) элемент, хранящийся в узле
allocator_type аллокатор, используемый при уничтожении элемента
container_node_type не указано
( тип-член только для демонстрации* )
ator_traits std:: allocator_traits < allocator_type >
( тип-член только для демонстрации* )

См. AssociativeContainer и UnorderedAssociativeContainer для фактических определений неэкспозиционных вложенных типов.

Члены данных

Элемент Описание

typename ator_traits  :: template
rebind_traits < container_node_type  > :: pointer

ptr_
указатель на узел контейнера, содержащий указанный объект [1]
( объект-член только для демонстрации* )
std:: optional < allocator_type > alloc_ сохранённый аллокатор
( объект-член только для демонстрации* )
  1. Владение указанным узлом контейнера уже было отсоединено от исходного контейнера при извлечении элемента. Даже если время жизни исходного контейнера завершилось, узел контейнера и содержащийся элемент остаются доступными.

Функции-члены

node-handle  :: node-handle

constexpr /*node-handle*/ ( ) noexcept ;
(1)
/*node-handle*/ ( /*node-handle*/ && other ) noexcept ;
(2) (constexpr since C++26)
1) Конструктор по умолчанию инициализирует node handle пустым состоянием.
2) Конструктор перемещения принимает владение элементом контейнера из other .
  • ptr_ инициализируется значением other. ptr_ .
  • alloc_ перемещается конструктором из other. alloc_ .
  • Присваивает nullptr в other. ptr_ .
  • Присваивает std:: nullopt в other. ptr_ .

Параметры

other - другой node handle

Примечания

Пользовательский конструктор копирования отсутствует. node-handle не является CopyConstructible .

Помимо перемещающего конструктора и перемещающего присваивания, непустой node-handle может быть создан только вызовом функций-членов extract (упорядоченных) ассоциативных контейнеров.

node-handle  :: operator=

/*node-handle*/ & operator = ( /*node-handle*/ && other ) ;
(constexpr since C++26)

Оператор перемещающего присваивания заменяет состояние * this состоянием other используя семантику перемещения.

  1. Если ptr_ ! = nullptr равно true , уничтожает элемент, на который ссылается * this , вызывая ator_traits  :: destroy , затем освобождает память для указанного элемента, вызывая ator_traits  :: rebind_traits < container-node-type  > :: deallocate .
  2. Присваивает other. ptr_ в ptr_ .
  3. Если ator_traits  :: propagate_on_container_move_assignment равно true , перемещает присваивание other. alloc_ в alloc_ .
  4. Присваивает nullptr в other. ptr_ и присваивает std:: nullopt в other. alloc_ .

Если все следующие значения равны false , поведение не определено:

  • ator_traits  :: propagate_on_container_move_assignment
  • ! alloc_
  • alloc_ == other. alloc_

Параметры

other - другой node handle

Возвращаемое значение

* 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 since C++26)

Возвращает true если node handle пуст, и false в противном случае.

Возвращаемое значение

ptr_ == nullptr

node-handle  :: operator bool

explicit operator bool ( ) const noexcept ;
(constexpr since C++26)

Преобразует в false если node handle пуст, и в 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 (только для контейнеров-словарей)

key_type & key ( ) const ;
(constexpr начиная с C++26)

Возвращает неконстантную ссылку на член key_type элемента, на который ссылается * this .

Если empty ( ) возвращает true , поведение не определено.

Возвращаемое значение

Как описано выше.

Исключения

Ничего не выбрасывает.

Примечания

Эта функция позволяет изменять ключ узла, извлеченного из словаря, и затем повторно вставлять его в словарь без копирования или перемещения элемента.

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 является ассоциированным классом аргументов.