node-handle
|
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
ptr_
|
указатель на узел контейнера, содержащий указанный объект
[1]
( объект-член только для демонстрации* ) |
std::
optional
<
allocator_type
>
alloc_
|
сохранённый аллокатор
( объект-член только для демонстрации* ) |
- ↑ Владение указанным узлом контейнера уже было отсоединено от исходного контейнера при извлечении элемента. Даже если время жизни исходного контейнера завершилось, узел контейнера и содержащийся элемент остаются доступными.
Функции-члены
node-handle :: node-handle
|
constexpr
/*node-handle*/
(
)
noexcept
;
|
(1) | |
|
/*node-handle*/
(
/*node-handle*/
&&
other
)
noexcept
;
|
(2) | (constexpr since C++26) |
-
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 используя семантику перемещения.
-
Если
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 | - | другой 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_
Исключения
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
является ассоциированным классом аргументов.