Spec-Zone.ru › C++

Обработка узла (C++17)

template</* unspecified */>
class /* node-handle */;
(с C++17)

Ассоциативные контейнеры std::set, std::map, std::multiset, std::multimap, std::unordered_set, std::unordered_map, std::unordered_multiset, std::unordered_multimap являются основанными на узлах структурами данных, и их узлы могут быть извлечены как объект неопределённого типа, известного как обработка узла.

Обработка узла — это тип, который можно перемещать только, который владеет и предоставляет доступ к элементу (value_type) хранящемуся в узле, и предоставляет доступ без модификатора const к ключевой части элемента (key_type) и отображаемой части элемента (mapped_type). Если обработка узла уничтожается, удерживая узел, узел уничтожается должным образом с использованием соответствующего аллокатора для контейнера. Обработка узла содержит копию аллокатора контейнера. Это необходимо для того, чтобы обработка узла могла существовать дольше контейнера.

Точный тип обработки узла (показанный здесь как /* обработка-узла */) не определён, но каждый контейнер раскрывает свой тип обработки узла как член node_type.

Обработку узлов можно использовать для передачи владения элементом между двумя ассоциативными контейнерами с одинаковым ключом, значением и типом аллокатора (игнорируя сравнение или хеш/равенство), не вызывая никаких операций копирования/перемещения на элемент контейнера (такая операция известна как "вставка"). Передача между уникальными и неуникальными контейнерами также разрешена: обработку узла из std::map можно вставить в std::multimap, но не в std::unordered_map или std::set.

Обработка узла может быть пустой, в этом случае она не содержит ни элемента, ни аллокатора. Обработка узла, созданная по умолчанию или из перемещения, является пустой. Кроме того, пустая обработка узла может быть получена в случае неудачного вызова функции члена контейнера extract.

Указатели и ссылки на элемент, полученные во время его владения обработкой узла, становятся недействительными, если элемент успешно вставлен в контейнер.

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

Типы членов

Тип члена Определение
key_type(только для контейнеров map) ключ, хранящийся в узле
mapped_type(только для контейнеров map) отображаемая часть элемента, хранящегося в узле
value_type(только для контейнеров set) элемент, хранящийся в узле
allocator_type аллокатор, который будет использоваться при уничтожении элемента

Функции членов

конструкторы

constexpr /* node-handle */() noexcept;
(1)
/* node-handle */ (/* node-handle */&& nh) noexcept;
(2)
1) Конструктор по умолчанию инициализирует обработку узла в пустом состоянии.
2) Конструктор перемещения принимает владение элементом контейнера из nh, перемещает конструктор члена аллокатор и оставляет nh в пустом состоянии.

Параметры

nh - обработка узла с тем же типом (не обязательно того же контейнера)

Примечания

Обработка узлов перемещается только, конструктор копирования не определён.

оператор=

/* node-handle */& operator=(/* node-handle */&& nh);
  • Если обработка узла не пуста,
    • уничтожает подобъект value_type в объекте элемента контейнера, управляемом этой обработкой узла, вызвав std::allocator_traits<allocator_type>::destroy;
    • освобождает элемент контейнера, вызвав std::allocator_traits<allocator_type>::rebind_traits</* container-node-type */>::deallocate;
  • Приобретает владение элементом контейнера из nh;
  • Если обработка узла была пустой (и поэтому не содержала аллокатор) или если std::allocator_traits<allocator_type>::propagate_on_container_move_assignment является true, переносит присваивание аллокатора из nh;
  • устанавливает nh в пустое состояние.

Поведение не определено, если узел не пуст и std::allocator_traits<allocator_type>::propagate_on_container_move_assignment является false и аллокаторы не равны.

Параметры

nh - обработка узла с тем же типом (не обязательно того же контейнера)

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

*this

Исключения

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

Примечания

Обработка узлов перемещается только, оператор присваивания копирования не определен.

Деструктор

~/* node-handle */();
  • Если обработка узла не пуста,
    • уничтожает подобъект value_type в объекте элемента контейнера, управляемом этой обработкой узла, вызвав std::allocator_traits<allocator_type>::destroy;
    • освобождает элемент контейнера, вызвав std::allocator_traits<allocator_type>::rebind_traits</* container-node-type */>::deallocate.

empty

bool empty() const noexcept;
(до C++20)
[[nodiscard]] bool empty() const noexcept;
(с C++20)

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

оператор bool

explicit operator bool() const noexcept;

Преобразует в false если обработка узла пуста, true в противном случае.

get_allocator

allocator_type get_allocator() const;

Возвращает копию хранящегося аллокатора (который является копией аллокатора исходного контейнера). Поведение не определено, если обработка узла пуста.

Исключения

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

value

value_type& value() const;
(только для контейнеров set)

Возвращает ссылку на подобъект value_type в объекте элемента контейнера, управляемом этой обработкой узла. Поведение не определено, если обработка узла пуста.

Исключения

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

key

key_type& key() const;
(только для контейнеров map)

Возвращает ссылку без модификатора const на член key_type подобъекта value_type в объекте элемента контейнера, управляемом этой обработкой узла. Поведение не определено, если обработка узла пуста.

Исключения

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

Примечания

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

mapped

mapped_type& mapped() const;
(только для контейнеров map)

Возвращает ссылку на член mapped_type подобъекта value_type в объекте элемента контейнера, управляемом этой обработкой узла. Поведение не определено, если обработка узла пуста.

Исключения

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

swap

void swap(/* node-handle */& nh) noexcept(/* see below */);
  • меняет владение узлами контейнера;
  • если один узел пуст или если оба узла не пусты и std::allocator_traits<allocator_type>::propagate_on_container_swap является true, меняет также и аллокаторы.

Поведение не определено, если оба узла не пусты и std::allocator_traits<allocator_type>::propagate_on_container_swap является false и аллокаторы не равны.

Исключение

noexcept спецификация:
noexcept(std::allocator_traits<allocator_type>::propagate_on_container_swap::value ||
std::allocator_traits<allocator_type>::is_always_equal::value)

Нечлен-функции

swap

friend void swap(/* node-handle */& x, /* node-handle */& y) noexcept(noexcept(x.swap(y)));

Эффективно выполняет x.swap(y).

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/node_handle

Spec-Zone.ru

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