Spec-Zone.ru › C++

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.

Члены-данные

Член Описание

typenameator_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 начиная с C++26)
1) Конструктор по умолчанию переводит дескриптор узла в пустое состояние.
2) Конструктор перемещения принимает во владение элемент контейнера из 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, используя семантику перемещения.

  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 - другой дескриптор узла

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

*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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API