std :: multiset是否保证插入顺序?

Nav*_*een 12 c++ stl standard-library data-structures

我有一个std::multiset存储元素class A.我operator<为这个课提供了自己的实现.我的问题是,如果我在这个multiset中插入两个等效对象,他们的顺序是否有保证?例如,首先我将一个对象a1插入到集合中,然后将一个等效对象a2插入到该集合中.当我遍历集合时,我可以期待a1之前a2的结果吗?如果不是,有没有办法用multiset实现这个目的?

GMa*_*ckG 21

在C++ 03中,您无法保证inserterase保留相对排序.但是,这在C++ 0x中已更改:

n3092,§23.2.4/ 4:关联容器支持唯一键,如果每个键最多可包含一个元素.否则,它支持等效键.set和map类支持唯一键; multiset和multimap类支持等效键.对于multiset和multimap,插入和擦除保留了等效元素的相对顺序. 强调我的.

缺陷报告中对此进行了讨论.这个页面是关于这个问题的评论集合,它写得很好并且非常充实.(我非常推荐通过之前的"概述"链接阅读此内容.)

从该评论页面中,您将找到当前实现的比较,因此您可以检查您打算使用的实现是否遵循您的期望.

我想不出一种强制你想要的排序的方法.:/

  • N1780 和 DR 371 清楚地表明所有当前的实现都提供稳定性,这是 RB 树的自然属性。但问题不在于现有元素的稳定性,而在于是在 a1 之前还是之后插入了 a2,答案是在之后(在 C++03 中实际上是正确的,在 C++11 中保证)。如果需要不同的行为,您可以使用插入提示在现有元素之前插入。 (2认同)