std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::flat_map
flat_map()
: flat_map(key_compare()) { }
| (1) | (начиная с C++23) |
template< class Allocator > flat_map( const flat_map&, const Allocator& alloc ); | (2) | (начиная с C++23) |
template< class Allocator > flat_map( flat_map&&, const Allocator& alloc ); | (3) | (начиная с C++23) |
flat_map( key_container_type key_cont, mapped_container_type mapped_cont,
const key_compare& comp = key_compare() );
| (4) | (начиная с C++23) |
template< class Allocator >
flat_map( const key_container_type& key_cont,
const mapped_container_type& mapped_cont,
const Allocator& alloc );
| (5) | (начиная с C++23) |
template< class Allocator >
flat_map( const key_container_type& key_cont,
const mapped_container_type& mapped_cont,
const key_compare& comp, const Allocator& alloc );
| (6) | (начиная с C++23) |
flat_map( std::sorted_unique_t, key_container_type key_cont,
mapped_container_type mapped_cont,
const key_compare& comp = key_compare() );
| (7) | (начиная с C++23) |
template< class Allocator >
flat_map( std::sorted_unique_t, const key_container_type& key_cont,
const mapped_container_type& mapped_cont, const Allocator& alloc );
| (8) | (начиная с C++23) |
template< class Allocator >
flat_map( std::sorted_unique_t, const key_container_type& key_cont,
const mapped_container_type& mapped_cont,
const key_compare& comp, const Allocator& alloc );
| (9) | (начиная с C++23) |
explicit flat_map( const key_compare& comp )
: c(), compare(comp) { }
| (10) | (начиная с C++23) |
template< class Allocator > flat_map( const key_compare& comp, const Allocator& alloc ); | (11) | (начиная с C++23) |
template< class Allocator > explicit flat_map( const Allocator& alloc ); | (12) | (начиная с C++23) |
template< class InputIter >
flat_map( InputIter first, InputIter last,
const key_compare& comp = key_compare() )
: c(), compare(comp);
| (13) | (начиная с C++23) |
template< class InputIter, class Allocator >
flat_map( InputIter first, InputIter last,
const key_compare& comp, const Allocator& alloc );
| (14) | (начиная с C++23) |
template< class InputIter, class Allocator > flat_map( InputIter first, InputIter last, const Allocator& alloc ); | (15) | (начиная с C++23) |
template< container-compatible-range<value_type> R >
flat_map( std::from_range_t, R&& rg, const key_compare& comp )
: flat_map(comp);
| (16) | (начиная с C++23) |
template< container-compatible-range<value_type> R >
flat_map( std::from_range_t fr, R&& rg )
: flat_map(fr, std::forward<R>(rg), key_compare()) { }
| (17) | (начиная с C++23) |
template< container-compatible-range<value_type> R, class Allocator > flat_map( std::from_range_t, R&& rg, const Allocator& alloc ); | (18) | (начиная с C++23) |
template< container-compatible-range<value_type> R, class Allocator >
flat_map( std::from_range_t, R&& rg, const key_compare& comp,
const Allocator& alloc );
| (19) | (начиная с C++23) |
template< class InputIter >
flat_map( std::sorted_unique_t s, InputIter first, InputIter last,
const key_compare& comp = key_compare() )
: c(), compare(comp);
| (20) | (начиная с C++23) |
template< class InputIter, class Allocator >
flat_map( std::sorted_unique_t s, InputIter first, InputIter last,
const key_compare& comp, const Allocator& alloc );
| (21) | (начиная с C++23) |
template< class InputIter, class Allocator >
flat_map( std::sorted_unique_t s, InputIter first, InputIter last,
const Allocator& alloc );
| (22) | (начиная с C++23) |
flat_map( std::initializer_list<value_type> init,
const key_compare& comp = key_compare() )
: flat_map(init.begin(), init.end(), comp) { }
| (23) | (начиная с C++23) |
template< class Allocator >
flat_map( std::initializer_list<value_type> init, const key_compare& comp,
const Allocator& alloc );
| (24) | (начиная с C++23) |
template< class Allocator > flat_map( std::initializer_list<value_type> init, const Allocator& alloc ); | (25) | (начиная с C++23) |
flat_map( std::sorted_unique_t s, std::initializer_list<value_type> init,
const key_compare& comp = key_compare() )
: flat_map(s, init.begin(), init.end(), comp) { }
| (26) | (начиная с C++23) |
template< class Allocator >
flat_map( std::sorted_unique_t s, std::initializer_list<value_type> init,
const key_compare& comp, const Allocator& alloc );
| (27) | (начиная с C++23) |
template< class Allocator >
flat_map( std::sorted_unique_t s, std::initializer_list<value_type> init,
const Allocator& alloc );
| (28) | (начиная с C++23) |
Создаёт новый адаптер контейнера из различных источников данных и, при необходимости, использует предоставленный пользователем объект-функцию сравнения comp и/или распределитель памяти alloc.
c с копией содержимого other.c, а compare — со значением other.compare. См. примечание об использовании распределителя памяти ниже.other, используя семантику перемещения. См. примечание об использовании распределителя памяти ниже.c.keys значением std::move(key_cont), c.values значением std::move(mapped_cont), а compare — значением comp. Затем сортирует базовый диапазон [begin(), end()) относительно value_comp(). Наконец, удаляет повторяющиеся элементы, как если бы выполнялось:auto zv = views::zip(c.keys, c.values);auto it = ranges::unique(zv, key_equiv(compare)).begin();auto dist = distance(zv.begin(), it);c.keys.erase(c.keys.begin() + dist, c.keys.end());c.values.erase(c.values.begin() + dist, c.values.end());. flat_map(key_cont, mapped_cont);. См. примечание об использовании распределителя памяти ниже.flat_map(key_cont, mapped_cont, comp);. См. примечание об использовании распределителя памяти ниже.c.keys значением std::move(key_cont), c.values значением std::move(mapped_cont), а compare — значением comp.flat_map(s, key_cont, mapped_cont);. См. примечание об использовании распределителя памяти ниже.flat_map(s, key_cont, mapped_cont, comp);. См. примечание об использовании распределителя памяти ниже.[first, last), эквивалентно insert(first, last);.rg. Сначала использует (10) как делегирующий конструктор. Затем инициализирует c содержимым rg, как если бы выполнялось insert_range(std::forward<R>(rg));.[first, last), как если бы выполнялось insert(first, last).init, используя (13) как делегирующий конструктор.init, используя (20) как делегирующий конструктор.Примечание для перегрузок (13-15,20-22): если [first, last) не является допустимым диапазоном, поведение не определено.
Примечание для перегрузок (4-6,13-19,23-25): если несколько элементов диапазона имеют ключи, эквивалентные при сравнении, не указано, какой из элементов будет вставлен (ожидает рассмотрения в LWG2844).
Примечание об использовании распределителя памяти
Конструкторы (2,3,5,6,8,9,11,12,14,15,17,19,21,22,24,25,27,28) эквивалентны соответствующим конструкторам без распределителя памяти, за исключением того, что базовые контейнеры c.keys и c.values создаются с использованием конструирования с использованием распределителя памяти. Эти перегрузки участвуют в разрешении перегрузки, только если std::uses_allocator_v<container_type, Allocator> является true.
Параметры
| key_cont | - | контейнер, используемый в качестве источника для инициализации базового контейнера ключей |
| mapped_cont | - | контейнер, используемый в качестве источника для инициализации базового контейнера значений |
| other | - | другой flat_map, используемый как источник для инициализации элементов базовых контейнеров |
| alloc | - | распределитель памяти, используемый для всех выделений памяти базовыми контейнерами |
| comp | - | объект-функция, используемый для всех сравнений ключей |
| first, last | - | пара итераторов, задающая исходный диапазон копируемых элементов |
| init | - | список инициализации для задания элементов базовых контейнеров |
| rg | - | диапазон, совместимый с контейнером (то есть input_range, элементы которого можно преобразовать в value_type), используемый как источник для инициализации базовых контейнеров |
| fr | - | тег для устранения неоднозначности, указывающий, что содержащийся член должен быть сконструирован из диапазона |
| s | - | тег для устранения неоднозначности, указывающий, что входная последовательность отсортирована относительно value_comp() и все её элементы уникальны |
| Требования к типам | ||
-InputIt должен соответствовать требованиям LegacyInputIterator. |
||
-Compare должен соответствовать требованиям Compare. |
||
-Allocator должен соответствовать требованиям Allocator. |
||
Сложность
other.cont.cont отсортирован относительно value_comp(); в противном случае \(\scriptsize \mathcal{O}(N\cdot\log{(N)})\)𝓞(N·log(N)), где \(\scriptsize N\)N — значение key_cont.size() до этого вызова.cont.[first, last) отсортирован относительно value_comp(); в противном случае \(\scriptsize \mathcal{O}(N\cdot\log{(N)})\)𝓞(N·log(N)), где \(\scriptsize N\)N — значение key_cont.size() до этого вызова.rg отсортирован относительно value_comp(); в противном случае \(\scriptsize \mathcal{O}(N\cdot\log{(N)})\)𝓞(N·log(N)), где \(\scriptsize N\)N — значение key_cont.size() до этого вызова.[first, last).init отсортированы относительно value_comp(); в противном случае \(\scriptsize \mathcal{O}(N\cdot\log{(N)})\)𝓞(N·log(N)), где \(\scriptsize N\)N — значение key_cont.size() до этого вызова.init.Исключения
Вызовы Allocator::allocate могут выбрасывать исключения.
Примечания
После перемещающего конструирования контейнера (перегрузка (3)) ссылки, указатели и итераторы, которые изначально ссылались на элементы в other, остаются действительными, но теперь ссылаются на элементы в *this. В текущем стандарте эта гарантия обеспечивается общим утверждением в [container.reqmts]/67; также рассматривается возможность более прямой гарантии посредством проблемы LWG 2321.
Пример
См. также
| присваивает значения адаптеру контейнера (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/flat_map/flat_map