Question

I have a multiset mymulti where I sort according to a class member m_a.

I want then to check for all sorted elements, if the difference in m_a for neighbour fields of mymulti is less than my given threshold, say 0.001. If so, then I want to prefer that which has a smaller another class member, m_b.

Here I am stuck, I have no experience with multiset or iterators. I don't know how to compare iterators from two iterations. If you can provide me with a right code for this what I want to do, will be very grateful! My try, not too much, just my concept:

    //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
Was it helpful?

Solution

You cannot (or if you can, depending on your STL implementation, should not) modify items once they have been inserted into a multiset, as it could violate the provided ordering of the items in the multiset. So swapping would be a bad idea, even if you could do it.

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

If you would like to remove items, use multiset::erase, which takes an iterator. I believe the standard practice for "modifying" an item in a multiset is to remove it, then insert the modified version.

As a side note, I noticed you're checking if two floating point numbers are close enough in value by using a fixed epsilon (0.001). As explained in this article, this only works if all the floats you are comparing are sufficiently small. See the article for a comparison that works equally well for large and small floating-point values.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top