C++ 确保在对象更改时对多集重新排序
我有一个带有自定义谓词函数的multiset,例如C++ 确保在对象更改时对多集重新排序,c++,stl,multiset,C++,Stl,Multiset,我有一个带有自定义谓词函数的multiset,例如multiset,其中MyCompFunc查看MyClass对象上的属性。在应用程序的运行过程中,对象可能会以某种方式发生变化,从而导致它们被重新排序 发生这种情况时,使多集重新排序的正确方法是什么?手动对其进行排序,或删除修改后的对象,对其进行更新,然后重新插入?不要通过引用访问对象。复制它们,如果密钥更改,则重新插入它们。您可以使用观察者自动执行此操作。不要通过引用访问对象。复制它们,如果密钥更改,则重新插入它们。您可以使用观察者来自动执行此
multiset
,其中MyCompFunc查看MyClass对象上的属性。在应用程序的运行过程中,对象可能会以某种方式发生变化,从而导致它们被重新排序
发生这种情况时,使多集重新排序的正确方法是什么?手动对其进行排序,或删除修改后的对象,对其进行更新,然后重新插入?不要通过引用访问对象。复制它们,如果密钥更改,则重新插入它们。您可以使用观察者自动执行此操作。不要通过引用访问对象。复制它们,如果密钥更改,则重新插入它们。您可以使用观察者来自动执行此操作。通常是删除、更新和重新插入。实际上,其他任何东西至少暂时违反了集合/多集合的主要不变量,这显然不是一件好事。通常是删除、更新和重新插入。实际上,其他任何内容至少暂时违反了集合/多集合的主要不变量,这显然不是一件好事。如果要更改对象比较键的一部分,请首先从集合中删除该项,然后执行修改,然后将其添加回集合中。这样可以避免破坏集合的不变量,因为集合不是为了在关键点更改时重新排序而设计的。如果要更改对象比较关键点的一部分,请首先从集合中删除该项,然后执行修改,然后将其添加回集合中。这样可以避免破坏集合的不变量,因为集合并不是为了在键更改时重新排序而设计的。我仍然找不到任何明确说明这一点的内容,但如果修改键[*],例如,比较器不满足25.3(严格弱顺序)的要求: comp导出一个定义良好的关系 关于确定的等价类 相当于
comp
如果在不同的时间为相同的输入返回不同的值,则它不是一个定义良好的关系
在您的例子中,我认为可以修改MyClass
中未涉及比较的字段
有趣的是,23.1.2/2说,“每个关联容器在键和排序关系比较上参数化,从而在键元素上产生严格的弱排序(25.3)”。我认为这意味着比较器对Key
对象(容器的元素)产生严格的弱排序,而不是对Key
类型的所有对象。例如,如果键是一个指针,那么我很确定,只要不使用空指针作为键,就可以编写一个取消引用它的比较器。根据同样的推理,我希望我们可以修改一个不在容器中的密钥
[*]我所说的“修改”,是指使用该键和其他键更改比较器的结果。当然,在这种情况下,您并没有真正修改键本身(它只是一个指针值),但我就是这么称呼它的。我仍然找不到任何明确说明这一点的内容,但如果您修改了键[*],例如,您的比较器不满足25.3(严格弱顺序)的要求: comp导出一个定义良好的关系 关于确定的等价类 相当于
comp
如果在不同的时间为相同的输入返回不同的值,则它不是一个定义良好的关系
在您的例子中,我认为可以修改MyClass
中未涉及比较的字段
有趣的是,23.1.2/2说,“每个关联容器在键和排序关系比较上参数化,从而在键元素上产生严格的弱排序(25.3)”。我认为这意味着比较器对Key
对象(容器的元素)产生严格的弱排序,而不是对Key
类型的所有对象。例如,如果键是一个指针,那么我很确定,只要不使用空指针作为键,就可以编写一个取消引用它的比较器。根据同样的推理,我希望我们可以修改一个不在容器中的密钥
[*]我所说的“修改”,是指使用该键和其他键更改比较器的结果。在这种情况下,您当然不会真正修改键本身(它只是一个指针值),但这就是我所说的。我通常会删除它并重新插入,但我只是将其作为注释而不是答案,因为我确信有更好的方法。我非常确定您必须删除即将修改的对象,然后修改它,然后重新插入它。但我现在找不到C++规范中的引用,它表示不能修改关联容器中的条目的键。这可能是史提夫所指的:关联容器迭代器的基本属性是它们以非降序的键顺序在容器中迭代,其中非降序被定义。通过构造它们时使用的比较。我通常会删除它,然后重新插入,但我只是把它作为注释而不是答案,因为我相信有更好的方法。我非常确定你必须删除即将修改的对象,然后修改它,然后重新插入它。但我现在找不到C++规范中的引用,它表示不能修改关联容器中的条目的键。这可能是史提夫所指的:关联容器迭代器的基本属性是它们以非降序的键顺序在容器中迭代,其中非降序被定义。通过用于构建它们的比较。