26 Containers library [containers]

26.2 Container requirements [container.requirements]

26.2.4 Node handles [container.node]

26.2.4.1 node_­handle overview [container.node.overview]

Anode handle - это объект, который принимает владение одним элементом изassociative container илиunordered associative container. Его можно использовать для передачи этого владения другому контейнеру с совместимыми узлами. Контейнеры с совместимыми узлами имеют одинаковый тип дескриптора узла. Элементы могут передаваться в любом направлении между типами контейнеров в одной строке таблицы89.

Таблица89 - Типы контейнеров с совместимыми узлами
map<K, T, C1, A> map<K, T, C2, A>
map<K, T, C1, A> multimap<K, T, C2, A>
set<K, C1, A> set<K, C2, A>
set<K, C1, A> multiset<K, C2, A>
unordered_­map<K, T, H1, E1, A> unordered_­map<K, T, H2, E2, A>
unordered_­map<K, T, H1, E1, A> unordered_­multimap<K, T, H2, E2, A>
unordered_­set<K, H1, E1, A> unordered_­set<K, H2, E2, A>
unordered_­set<K, H1, E1, A> unordered_­multiset<K, H2, E2, A>

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

Классnode_­handle предназначен только для экспозиции. Реализации разрешено предоставлять эквивалентную функциональность без предоставления класса с этим именем.

Если определенная пользователем специализацияpair существует для pair<const Key, T> илиpair<Key, T>, гдеKey - контейнер,key_­type аT - контейнер mapped_­type, поведение операций, связанных с дескрипторами узлов, не определено.

template<unspecified>
  class node_handle {
  public:
    // These type declarations are described in Tables 90 and 91.
    using value_type     = see below;   // not present for map containers
    using key_type       = see below;   // not present for set containers
    using mapped_type    = see below;   // not present for set containers
    using allocator_type = see below;

  private:
    using container_node_type = unspecified;
    using ator_traits = allocator_traits<allocator_type>;

    typename ator_traits::rebind_traits<container_node_type>::pointer ptr_;
    optional<allocator_type> alloc_;

  public:
    constexpr node_handle() noexcept : ptr_(), alloc_() {}
    ~node_handle();
    node_handle(node_handle&&) noexcept;
    node_handle& operator=(node_handle&&);

    value_type& value() const;          // not present for map containers
    key_type& key() const;              // not present for set containers
    mapped_type& mapped() const;        // not present for set containers

    allocator_type get_allocator() const;
    explicit operator bool() const noexcept;
    bool empty() const noexcept;

    void swap(node_handle&)
      noexcept(ator_traits::propagate_on_container_swap::value ||
               ator_traits::is_always_equal::value);

    friend void swap(node_handle& x, node_handle& y) noexcept(noexcept(x.swap(y))) {
      x.swap(y);
    }
};

26.2.4.2 node_­handle constructors, copy, and assignment [container.node.cons]

node_handle(node_handle&& nh) noexcept;

Effects: Создаетnode_­handle объект, инициализируемый ptr_­ с помощьюnh.ptr_­. Перемещайте конструкцииalloc_­ с помощью nh.alloc_­. Назначаетnullptr кnh.ptr_­ и правопреемникам nullopt кnh.alloc_­.

node_handle& operator=(node_handle&& nh);

Requires: Либо!alloc_­, либо ator_­traits​::​propagate_­on_­container_­move_­assignment естьtrue, либоalloc_­ == nh.alloc_­.

Effects:

  • Еслиptr_­ != nullptrуничтожаетvalue_­type подобъект вcontainer_­node_­type объекте, на который указываетptr_­ вызовator_­traits​::​destroy, затем освобождает егоptr_­ путем вызоваator_­traits​::​rebind_­traits<container_­node_­type>​::​deallocate.

  • Назначаетnh.ptr_­ вptr_­.

  • Если!alloc_ илиator_­traits​::​propagate_­on_­container_­move_­assignment естьtrue, move назначаетnh.alloc_­ наalloc_­.

  • Назначает nullptr кnh.ptr_­ и правопреемникамnullopt к nh.alloc_­.

Returns:*this.

Throws: Ничего такого.

26.2.4.3 node_­handle destructor [container.node.dtor]

~node_handle();

Effects: Еслиptr_­ != nullptrуничтожаетvalue_­type подобъект вcontainer_­node_­type объекте, на который указываетptr_­ вызов ator_­traits​::​destroy, затем освобождает егоptr_­ путем вызова ator_­traits​::​rebind_­traits<container_­node_­type>​::​deallocate.

26.2.4.4 node_­handle observers [container.node.observers]

value_type& value() const;

Requires:empty() == false.

Returns: Ссылка наvalue_­type подобъект в container_­node_­type объекте, на который указываетptr_­.

Throws: Ничего такого.

key_type& key() const;

Requires:empty() == false.

Returns: Неконстантная ссылка наkey_­type член value_­type подобъекта вcontainer_­node_­type объекте, на который указываетptr_­.

Throws: Ничего такого.

Remarks: Разрешено изменение ключа с помощью возвращенной ссылки.

mapped_type& mapped() const;

Requires:empty() == false.

Returns: Ссылка наmapped_­type член value_­type подобъекта вcontainer_­node_­type объекте, на который указываетptr_­.

Throws: Ничего такого.

allocator_type get_allocator() const;

Requires:empty() == false.

Returns:*alloc_­.

Throws: Ничего такого.

explicit operator bool() const noexcept;

Returns:ptr_­ != nullptr.

bool empty() const noexcept;

Returns:ptr_­ == nullptr.

26.2.4.5 node_­handle modifiers [container.node.modifiers]

void swap(node_handle& nh) noexcept(ator_traits::propagate_on_container_swap::value || ator_traits::is_always_equal::value);

Requires:!alloc_­, или!nh.alloc_­, или ator_­traits​::​propagate_­on_­container_­swap естьtrue, илиalloc_­ == nh.alloc_­.

Effects: Звонкиswap(ptr_­, nh.ptr_­). Если!alloc_­, или !nh.alloc_­, илиator_­traits​::​propagate_­on_­container_­swap этоtrue звонкиswap(alloc_­, nh.alloc_­).