使用std :: multimap,是否保证begin()方法返回最新的元素?

时间:2015-01-23 11:14:44

标签: c++ c++11 iterator multimap c++-standard-library

我是C ++的新手。我想知道:如果std::multimap(C ++ 11)集合的迭代器中有一些插入时间保留?

我认为,因为它被任意值索引,所以不能保证迭代器中元素的排序会保留插入时间,但是我正在研究一些代码,这些代码做出了不同的假设,即返回的元素begin()与插入顺序相关。

3 个答案:

答案 0 :(得分:3)

标准容器本身不会跟踪插入时间。 std::multimap::begin()使用创建时指定的比较函数或简单的'<'返回键值最小的元素。默认情况下:如果您使用插入时间(或者说按时间顺序递增的数字递增)作为键,则只有begin()才会为您提供“最新”元素。如果您使用插入时间键并且仅以第二个分辨率捕获,则可能有相同键/时间的多个条目,并且如果您有理由需要在这些条目中编排正确的顺序。

答案 1 :(得分:2)

“在内部,多图中的元素总是按照其内部比较对象(比较类型)指示的特定严格弱排序标准按其键排序。” http://www.cplusplus.com/reference/map/multimap/

因此,begin()应始终为您提供地图的第一个元素,默认情况下不按插入时间排序。

编辑: 我喜欢其他答案,所以编写一个派生自std:multimap的新类可能是个好主意。然后添加时间戳或int insertNr或id作为成员变量并覆盖compare-method!

答案 2 :(得分:1)

基于 Tony D的答案,一个想法是使用时间戳来获得非常小的精度(毫秒/纳秒等)的密钥。如果使用线程,则必须应用一种机制来确保没有插入两个具有相同时间戳的对象(插入std::multimap时锁定等)。

更新:如果您仅出于订购原因使用密钥,则其他结构可能更适合您,例如std::list