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

Using a std::multimap, is it guaranteed that the begin() method returns the newest element?

本文关键字:方法 返回 最新 元素 begin multimap std 是否 使用      更新时间:2023-10-16

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

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

标准容器本身不记录/存储插入时间,而只是在具有"等效"键的任何一组元素中,自 C++11 以来,插入顺序由它们在所使用的树数据结构中的存储位置隐含,前向迭代将按照插入它们的顺序遍历它们。 我说"等效"是因为在集合/映射/多集/多映射中,键不能与==进行比较;相反,如果两者都不小于另一个,则它们被视为"等效",因此您只需为键类型定义operator<(如果您不指定自己的键类型,它将使用键类型的默认<运算符)。

如果你想在容器中的所有元素中进行插入顺序迭代,那么你必须使用某种增加序列的方式作为键 - 可以是时间戳或例如递增整数(或 - 一个技术上正确但愚蠢的替代方案 - 整个表必须具有具有相同键的元素,但如果你期望你可能应该使用vector<>list<>)。

"在内部,多重映射中的元素始终按照其内部比较对象(类型为比较)指示的特定严格弱排序标准按其键排序。http://www.cplusplus.com/reference/map/multimap/

所以 begin() 应该总是给你映射的第一个元素,默认情况下不按插入时间排序。

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

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

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