Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确保在对象更改时对多集重新排序_C++_Stl_Multiset - Fatal编程技术网

C++ 确保在对象更改时对多集重新排序

C++ 确保在对象更改时对多集重新排序,c++,stl,multiset,C++,Stl,Multiset,我有一个带有自定义谓词函数的multiset,例如multiset,其中MyCompFunc查看MyClass对象上的属性。在应用程序的运行过程中,对象可能会以某种方式发生变化,从而导致它们被重新排序 发生这种情况时,使多集重新排序的正确方法是什么?手动对其进行排序,或删除修改后的对象,对其进行更新,然后重新插入?不要通过引用访问对象。复制它们,如果密钥更改,则重新插入它们。您可以使用观察者自动执行此操作。不要通过引用访问对象。复制它们,如果密钥更改,则重新插入它们。您可以使用观察者来自动执行此

我有一个带有自定义谓词函数的multiset,例如
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++规范中的引用,它表示不能修改关联容器中的条目的键。这可能是史提夫所指的:关联容器迭代器的基本属性是它们以非降序的键顺序在容器中迭代,其中非降序被定义。通过用于构建它们的比较。