我想使用std::multimap
容器,但我需要知道它将始终保持顺序,因为在第一个元素中将是迭代的第一个元素,第二个元素将始终是第二个元素。
我问的是这个:
std::multimap< key, value >
相当于std::vector< std::pair< const key, std::vector< value > > >
多图不等同于矢量,而不是实现方面。 Multimaps通常实现为二叉搜索树。根据比较对象指示的严格弱顺序标准,多重映射的元素始终按其排序顺序保存。
因此,当您迭代多图的元素时,它们的顺序是比较对象提供的排序顺序。
std :: multimap <key,value>等效于std :: vector <std :: pair <const key,std :: vector <value >>>?
不,这是两个不同的容器,它们在存储底层数据,如何管理内存,如何访问这些数据以及存储数据的顺序方面表现出很多差异。在vector
中,数据存储的顺序是你有push_back编辑它,但在multimap
数据总是被排序,所以例如您插入multimap
的最后一个值实际上可以通过multimap.begin()
或multimap.begin() + 10
访问。
您可以在multimap中使用整数键,并使用递增键插入以强制排序顺序与插入顺序相同。
虽然它们在实现方面不尽相同,但您的问题表明您真的只关心订购。我找到了与订购相关的以下信息:
Multimaps是关联容器,用于存储由键值和映射值的组合形成的元素,遵循特定顺序,并且多个元素可以具有等效键。
在内部,多图中的元素总是按照其内部比较对象(类型比较)指示的特定严格弱排序标准按其键排序。
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);