0

クラスメンバーに従ってソートするマルチセットmymulti がありm_aます。

次に、並べ替えられたすべての要素をチェックしたいのですがm_a、隣のフィールドの差が、指定しmymultiたしきい値、たとえば 0.001 より小さい場合です。もしそうなら、私は別のクラスメンバー m_b が小さい方を優先したいと思います。

マルチセットやイテレータの経験がありません。2 つの反復から反復子を比較する方法がわかりません。私がやりたいことの正しいコードを私に提供できれば、とても感謝しています! 私の試み、あまり多くはありませんが、私のコンセプトだけです:

    //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
4

1 に答える 1

0

multisetに挿入された項目は、 で提供されている項目の順序に違反する可能性があるため、変更することはできません (または、STL の実装によっては変更する必要があります) multiset。したがって、スワップができたとしても、スワップは悪い考えです。

https://stackoverflow.com/a/2038534/713961およびhttp://www.cplusplus.com/reference/set/multiset/を参照してください

アイテムを削除したい場合multiset::eraseは、イテレータを取る を使用します。マルチセット内のアイテムを「変更」するための標準的な方法は、それを削除してから、変更されたバージョンを挿入することだと思います。

補足として、固定イプシロン (0.001) を使用して、2 つの浮動小数点数の値が十分に近いかどうかを確認していることに気付きました。この記事で説明されているように、これは、比較するすべてのフロートが十分に小さい場合にのみ機能します。大小の浮動小数点値で同じように機能する比較については、記事を参照してください。

于 2013-01-28T15:14:53.937 に答える