У меня мультимножество mymult
я где я сортирую в соответствии с учеником 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
Вы не можете (или если можете, в зависимости от вашей реализации STL, не должны) изменять элементы после их вставки в multiset
, так как это может нарушить предусмотренный порядок пунктов в multiset
, Так что подмена была бы плохой идеей, даже если бы ты мог это сделать.
Увидеть https://stackoverflow.com/a/2038534/713961 а также http://www.cplusplus.com/reference/set/multiset/
Если вы хотите удалить элементы, используйте multiset::erase
, который занимает итератор. Я полагаю, что стандартная практика «изменения» элемента в мультимножестве состоит в том, чтобы удалить его, а затем вставить измененную версию.
В качестве примечания я заметил, что вы проверяете, достаточно ли близки по значению два числа с плавающей запятой, используя фиксированный эпсилон (0,001). Как объяснено в Эта статья, это работает только в том случае, если все поплавки, которые вы сравниваете, достаточно малы. См. Статью для сравнения, которое одинаково хорошо работает для больших и малых значений с плавающей точкой.
Других решений пока нет …