使用 std::multimap,是否可以保证 begin() 方法返回最新的元素
Using a std::multimap, is it guaranteed that the begin() method returns the newest element?
我是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
。
- 从父类方法返回子类对象
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 让bool方法返回其他整数
- 不能将方法返回的值用于另一个方法
- 从私有成员变量的成员方法返回unique_ptr
- 我的模板类方法返回错误类型?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 我无法使用C++指针指向类方法返回的 std::vector
- 对象引用中的字段以不同的方法返回不同的值
- 类方法返回指向具有模板的类成员的指针
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 从工厂方法返回的ComPtr的引用计数增加两次
- 如何使用 SFINAE 从 end() 方法返回 (const_) 迭代器
- Arduino trim() 和 replace() 方法返回从 'void' 到非标量类型'String'请求的转换
- 从类方法返回 "const char*" 作为 std::string&
- 如何使用 "get" 方法返回类的私有 std::unique_ptr 成员
- 可能从单个方法返回不同类型的对象
- qml 未知方法返回类型:ArchiveFile*,即使调用了 qmlRegisterUncreatableType
- 如何从方法返回静态常量 int std::array?
- 当从其他方法返回 vector 时,C++无法访问矢量元素