是std :: multimap真的只是嵌套的矢量

问题描述 投票:2回答:4

我想使用std::multimap容器,但我需要知道它将始终保持顺序,因为在第一个元素中将是迭代的第一个元素,第二个元素将始终是第二个元素。 我问的是这个:

std::multimap< key, value >相当于std::vector< std::pair< const key, std::vector< value > > >

c++ vector stl multimap
4个回答
4
投票

多图不等同于矢量,而不是实现方面。 Multimaps通常实现为二叉搜索树。根据比较对象指示的严格弱顺序标准,多重映射的元素始终按其排序顺序保存。

因此,当您迭代多图的元素时,它们的顺序是比较对象提供的排序顺序。


2
投票

std :: multimap <key,value>等效于std :: vector <std :: pair <const key,std :: vector <value >>>?

不,这是两个不同的容器,它们在存储底层数据,如何管理内存,如何访问这些数据以及存储数据的顺序方面表现出很多差异。在vector中,数据存储的顺序是你有push_back编辑它,但在multimap数据总是被排序,所以例如您插入multimap的最后一个值实际上可以通过multimap.begin()multimap.begin() + 10访问。

您可以在multimap中使用整数键,并使用递增键插入以强制排序顺序与插入顺序相同。


1
投票

虽然它们在实现方面不尽相同,但您的问题表明您真的只关心订购。我找到了与订购相关的以下信息:

Multimaps是关联容器,用于存储由键值和映射值的组合形成的元素,遵循特定顺序,并且多个元素可以具有等效键。

在内部,多图中的元素总是按照其内部比较对象(类型比较)指示的特定严格弱排序标准按其键排序。

来源,cplusplus.com


1
投票

std::vector< std::pair< const key, std::vector< value > > >允许你对key元素进行任何排序,而std::multimap<key, value>则没有。

来自cppreference

Multimap是一个关联容器,包含键值对的排序列表,同时允许多个条目具有相同的键。根据应用于键的比较函数Compare进行排序。

这听起来像是在问同等条目中的顺序是什么。

键与其等效的键值对的顺序是插入的顺序,并且不会改变。 (自C ++ 11以来)

您可以通过确保在所有现有等效条目之后插入新条目,但在任何条目的后续条目之前插入新条目,来保持向量的顺序与多图提供的顺序相同。一种简单的方法可以阻止所有插入

vec.insert(std::upper_bound(vec.begin(), vec.end(), to_insert, key_compare), to_insert);
© www.soinside.com 2019 - 2024. All rights reserved.