0

我有一个带有自定义谓词函数的多重集,例如multiset<MyClass *,MyCompFunc>MyCompFunc 查看 MyClass 对象的属性。在应用程序的过程中,对象可能会以某种方式发生变化,从而导致它们被重新排序。

发生这种情况时,让多重集重新排序的正确方法是什么?手动排序,还是删除修改的对象,更新,重新插入?

4

4 回答 4

3

通常是删除、更新和重新插入。几乎任何其他至少暂时违反了集合/多集合的主要不变量,这显然不是一件好事。

于 2010-09-03T18:13:36.173 回答
1

我仍然找不到任何明确说明这一点的内容,但是如果您修改键 [*],则例如您的比较器不满足 25.3 的要求(严格弱顺序):

comp 在由 equiv 确定的等价类上引入明确定义的关系

comp如果它在不同时间为相同的输入返回不同的值,则它不是一个定义明确的关系。

在您的情况下,我认为修改MyClass比较中不涉及的字段是可以的。

有趣的是,23.1.2/2 说,“每个关联容器都在 Key 上进行参数化,并且排序关系 Compare 会在 Key 的元素上产生严格的弱排序 (25.3)”。我认为我们可以认为这意味着比较器对作为容器元素的Key对象产生严格的弱排序,而不必对所有类型的对象进行排序。例如,如果 Key 是一个指针,那么我很确定编写一个取消引用它的比较器是可以的,只要您不使用空指针作为键。同样的道理,我希望我们可以修改一个不在容器中的密钥。Key

[*] 通过“修改”,我的意思是用那个键和其他键做任何改变比较器结果的事情。当然,在这种情况下,您并没有真正修改密钥本身(这只是一个指针值),但这就是我所说的。

于 2010-09-04T09:22:12.023 回答
0

不要通过引用访问对象。复制它们,如果它们的密钥发生变化,则重新插入它们。您可以使用观察者来自动执行此操作。

于 2010-09-03T18:12:23.260 回答
0

如果您要更改对象的部分比较键,请先从集合中删除该项目,然后执行修改,然后将其添加回集合中。这样您就可以避免破坏集合的不变量,因为集合并非旨在对关键更改进行重新排序。

于 2010-09-03T18:15:55.163 回答