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, |
(5) | (自 C++23 起) |
template< class Allocator > flat_map( const key_container_type& key_cont, |
(6) | (自 C++23 起) |
flat_map( std::sorted_unique_t, key_container_type key_cont, mapped_container_type mapped_cont, |
(7) | (自 C++23 起) |
template< class Allocator > flat_map( std::sorted_unique_t, const key_container_type& key_cont, |
(8) | (自 C++23 起) |
template< class Allocator > flat_map( std::sorted_unique_t, const key_container_type& key_cont, |
(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, |
(13) | (自 C++23 起) |
template< class InputIter, class Allocator > flat_map( InputIter first, InputIter last, |
(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 ) |
(16) | (自 C++23 起) |
template< container-compatible-range<value_type> R > flat_map( std::from_range_t fr, R&& rg ) |
(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, |
(19) | (自 C++23 起) |
template< class InputIter > flat_map( std::sorted_unique_t s, InputIter first, InputIter last, |
(20) | (自 C++23 起) |
template< class InputIter, class Allocator > flat_map( std::sorted_unique_t s, InputIter first, InputIter last, |
(21) | (自 C++23 起) |
template< class InputIter, class Allocator > flat_map( std::sorted_unique_t s, InputIter first, InputIter last, |
(22) | (自 C++23 起) |
flat_map( std::initializer_list<value_type> init, const key_compare& comp = key_compare() ) |
(23) | (自 C++23 起) |
template< class Allocator > flat_map( std::initializer_list<value_type> init, const key_compare& comp, |
(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() ) |
(26) | (自 C++23 起) |
template< class Allocator > flat_map( std::sorted_unique_t s, std::initializer_list<value_type> init, |
(27) | (自 C++23 起) |
template< class Allocator > flat_map( std::sorted_unique_t s, std::initializer_list<value_type> init, |
(28) | (自 C++23 起) |
使用各种数据源构造新的容器适配器,并且可以选择使用用户提供的比较函数对象 comp 和/或分配器 alloc。
c.keys
,使用 std::move(mapped_cont) 初始化 c.values
,使用 comp 初始化 compare
。然后,根据 value_comp() 对底层范围 [
begin(),
end())
进行排序。最后,像下面这样删除重复元素: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());.
[
first,
last)
的内容构造容器适配器,等效于 insert(first, last);。c
,就好像通过 insert_range(std::forward<R>(rg)); 那样。[
first,
last)
的内容构造底层容器,就好像通过 insert(first, last) 那样。对于重载 (13-15,20-22) 的说明:如果 [
first,
last)
不是一个 有效范围,则行为未定义。
对于重载 (4-6,13-19,23-25) 的说明:如果范围中的多个元素具有比较相等的键,则插入哪个元素是未指定的(待处理 LWG2844)。
内容 |
[edit] 分配器使用说明
构造函数 (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 时,这些重载才会参与重载解析。
[edit] 参数
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 的要求。 |
[edit] 复杂度
[
first,
last)
根据 value_comp() 排序,则在 N 中为线性,否则为 𝓞(N·log(N)),其中 N 是此调用之前 key_cont.size() 的值。[
first,
last)
的大小线性。[edit] 异常
对 Allocator::allocate
的调用可能会抛出异常。
[edit] 注释
在容器移动构造(重载 (3))之后,对 other
的引用、指针和迭代器(除末尾迭代器外)保持有效,但指向现在位于 *this 中的元素。当前标准通过 [container.reqmts]/67 中的笼统声明来保证这一点,而更直接的保证正在通过 LWG issue 2321 进行考虑。
[edit] 示例
本节不完整 原因:没有示例 |
[edit] 另请参阅
将值赋给容器适配器 (公有成员函数) |