【问题标题】:c++ multiset iterator sortingC++ 多集迭代器排序
【发布时间】:2013-01-11 22:50:07
【问题描述】:

我有一个多重集mymulti,我根据班级成员m_a 进行排序。

然后我想检查所有已排序的元素,如果 m_a 的相邻字段 mymulti 的差异小于我给定的阈值,例如 0.001。如果是这样,那么我想更喜欢另一个类成员 m_b 较小的那个。

我被卡住了,我没有使用多重集或迭代器的经验。我不知道如何比较两次迭代的迭代器。如果您能为我提供正确的代码,我将不胜感激! 我的尝试,不是太多,只是我的概念:

    //all before I got stuck
    for(it = mymulti.begin(); it!= mymulti.end(); ++it) //or it++?
        if( (it+1)->mymulti.m_a - (it)->mymulti.m_a < 0.001)
           if ((it+1)->mymulti.m_b < (it)->mymulti.m_b)
              //swap them. but how to swap two fields in a multiset, not two multisets?
           // otherwise do nothing

【问题讨论】:

  • 不要将浮点变量作为集合的键...
  • 我没有别的选择,为什么我不应该,因为计算时间?无论如何它已经在工作了,我只想在里面添加这个“内秒”排序..
  • @eReM 因为浮点数是近似值,直接比较时不能可靠地相互相等。例如,0.1 * 10.01.00.1 + 0.1 + 0.1 ... 可能都等于不同的值。见altdevblogaday.com/2012/02/22/…
  • 另外,如果你用相距 0.001(从 0 到 1000)的元素填充你的集合怎么办。这是否意味着 0 和 1000 相同?
  • @Kerrek SB 我稍后不得不依赖这里的可能性,算法并不重要,不过感谢这个提示。所以可以说我只想检查前两个元素。如何正确地做?

标签: c++ sorting iterator multiset


【解决方案1】:

一旦项目被插入multiset,您就不能(或者如果可以,根据您的 STL 实现,不应该)修改项目,因为这可能违反 multiset 中提供的项目顺序。所以即使你能做到,交换也是个坏主意。

https://stackoverflow.com/a/2038534/713961http://www.cplusplus.com/reference/set/multiset/

如果您想删除项目,请使用multiset::erase,它需要一个迭代器。我相信“修改”多集中项目的标准做法是删除它,然后插入修改后的版本。

作为旁注,我注意到您正在使用固定的 epsilon (0.001) 检查两个浮点数的值是否足够接近。正如this article 中所解释的,这仅在您要比较的所有浮点数都足够小的情况下才有效。请参阅这篇文章,了解对大浮点值和小浮点值同样适用的比较。

【讨论】:

  • 如果你想根据 2 个参数排序,一个优先级较高,第二个优先级较低,以防第一个参数对于 multiset 中的几个字段相同,你会怎么做那么呢?
  • @eReM 如果我不希望商品具有相同的价值以便订购,我会使用set 而不是multisetsets 不允许对于相同价值的物品)。如果您想使用两个优先级进行排序,所有有序的关联容器(mapsetmultiset 等)都可以采用自定义比较器函数(请参阅en.cppreference.com/w/cpp/container/set/set),它可以根据需要对项目进行排序。
  • 感谢您的提示!这里的正确想法是我认为在第一次排序后更改比较器函数而不是添加代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2019-03-26
  • 2012-04-19
  • 1970-01-01
  • 2011-05-13
  • 2023-02-02
  • 2017-04-19
相关资源
最近更新 更多