我是C ++的新手。我想知道:如果std::multimap
(C ++ 11)集合的迭代器中有一些插入时间保留?
我认为,因为它被任意值索引,所以不能保证迭代器中元素的排序会保留插入时间,但是我正在研究一些代码,这些代码做出了不同的假设,即返回的元素begin()
与插入顺序相关。
答案 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
。