命名空间
变体
操作

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::flat_map

来自 cppreference.com
< cpp‎ | container‎ | 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

1) 默认构造函数。构造一个空的容器适配器。
2) 复制构造函数。使用 other.c 的内容副本构造 c,使用 other.compare 构造 compare。请参见下面的 分配器使用说明
3) 移动构造函数。使用移动语义,使用 other 的内容构造容器适配器。请参见下面的 分配器使用说明
4) 首先,使用 std::move(key_cont) 初始化 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());
.
5)(4) 相同,等效于 flat_map(key_cont, mapped_cont);。请参见下面的 分配器使用说明
6)(4) 相同,等效于 flat_map(key_cont, mapped_cont, comp);。请参见下面的 分配器使用说明
7) 使用 std::move(key_cont) 初始化 c.keys,使用 std::move(mapped_cont) 初始化 c.values,使用 comp 初始化 compare
8)(7) 相同,等效于 flat_map(s, key_cont, mapped_cont);。请参见下面的 分配器使用说明
9)(7) 相同,等效于 flat_map(s, key_cont, mapped_cont, comp);。请参见下面的 分配器使用说明
10) 构造一个空的容器适配器。
11,12) 构造一个空的容器适配器。请参见下面的 分配器使用说明
13) 使用范围 [firstlast) 的内容构造容器适配器,等效于 insert(first, last);
14,15)(13) 相同。请参见下面的 分配器使用说明
16) 使用范围 rg 的内容构造容器适配器。首先,使用 (10) 作为 委托构造函数。然后使用 rg 的内容初始化 c,就好像通过 insert_range(std::forward<R>(rg)); 那样。
17)(16) 相同,使用它作为 委托构造函数
18,19)(16) 相同。请参见下面的 分配器使用说明
20) 使用范围 [firstlast) 的内容构造底层容器,就好像通过 insert(first, last) 那样。
21,22)(20) 相同。请参见下面的 分配器使用说明
23) 一个 初始化列表构造函数。使用 init 初始化列表的内容构造底层容器,使用 (13) 作为 委托构造函数
24,25)(23) 相同。请参见下面的 分配器使用说明
26) 一个 初始化列表构造函数。使用 init 初始化列表的内容构造底层容器,使用 (20) 作为 委托构造函数
27,28)(26) 相同。请参见下面的 分配器使用说明

对于重载 (13-15,20-22) 的说明:如果 [firstlast) 不是一个 有效范围,则行为未定义。

对于重载 (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.keysc.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] 复杂度

1) 常量。
2) other 大小线性。
3) 与包装容器的相应移动构造函数相同,即 cont 大小线性或常量。
4-6) 如果 cont 根据 value_comp() 排序,则在 N 中为线性,否则为 𝓞(N·log(N)),其中 N 是此调用之前 key_cont.size() 的值。
7-9) 与封装容器的相应移动构造函数相同,即 cont 的大小为常数或线性。
10-12) 常数。
13-15) 如果输入范围 [firstlast) 根据 value_comp() 排序,则在 N 中为线性,否则为 𝓞(N·log(N)),其中 N 是此调用之前 key_cont.size() 的值。
16-19) 如果输入范围 rg 根据 value_comp() 排序,则在 N 中为线性,否则为 𝓞(N·log(N)),其中 N 是此调用之前 key_cont.size() 的值。
20-22) [firstlast) 的大小线性。
23-25) 如果 init 的元素根据 value_comp() 排序,则在 N 中为线性,否则为 𝓞(N·log(N)),其中 N 是此调用之前 key_cont.size() 的值。
26-28) init 的大小线性。

[edit] 异常

Allocator::allocate 的调用可能会抛出异常。

[edit] 注释

在容器移动构造(重载 (3))之后,对 other 的引用、指针和迭代器(除末尾迭代器外)保持有效,但指向现在位于 *this 中的元素。当前标准通过 [container.reqmts]/67 中的笼统声明来保证这一点,而更直接的保证正在通过 LWG issue 2321 进行考虑。

[edit] 示例

[edit] 另请参阅

将值赋给容器适配器
(公有成员函数) [edit]