многосетевая сортировка c ++

У меня мультимножество 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

0

Решение

Вы не можете (или если можете, в зависимости от вашей реализации STL, не должны) изменять элементы после их вставки в multiset, так как это может нарушить предусмотренный порядок пунктов в multiset, Так что подмена была бы плохой идеей, даже если бы ты мог это сделать.

Увидеть https://stackoverflow.com/a/2038534/713961 а также http://www.cplusplus.com/reference/set/multiset/

Если вы хотите удалить элементы, используйте multiset::erase, который занимает итератор. Я полагаю, что стандартная практика «изменения» элемента в мультимножестве состоит в том, чтобы удалить его, а затем вставить измененную версию.

В качестве примечания я заметил, что вы проверяете, достаточно ли близки по значению два числа с плавающей запятой, используя фиксированный эпсилон (0,001). Как объяснено в Эта статья, это работает только в том случае, если все поплавки, которые вы сравниваете, достаточно малы. См. Статью для сравнения, которое одинаково хорошо работает для больших и малых значений с плавающей точкой.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]