как сделать набор, используя самоопределяющуюся дублированную функцию судьи? - PullRequest
1 голос
/ 12 мая 2019

Я хочу использовать STL, установленный на:

  1. вставьте struct в этот набор, как struct {int id, string info};
  2. для каждой вставки, если идентификатор существует, не вставляйте
  3. сделать элемент отсортированным

Я попробовал следующий код:

#include <iostream>
#include <set>
using namespace std;
struct song
{
    int m_id;
    int m_hot;
    song(int id,int hot)
    {

        this->m_id = id;
        this->m_hot = hot;
    }
    bool operator<(const struct song & right)const
    {
        if(this->m_id == right.m_id) {     // remove duplicated
            return false;
        }
        if(this->m_hot != right.m_hot)
        {
            return this->m_hot > right.m_hot;
        }
        else
        {
            return this->m_id > right.m_id;
        }
    }
};
int main()
{
    std::set<song> mySet;
    song s1(10,100);
    song s2(40,700);
    song s3(40,300);
    song s4(30,200);
    song s5(300,200);
    song s6(300,900);
    mySet.insert(s1);
    mySet.insert(s2);
    mySet.insert(s3);
    mySet.insert(s4);
    mySet.insert(s5);
    mySet.insert(s6);
    for(auto it:mySet)
    {
        std::cout<<"id:"<<it.m_id<<",hot:"<<it.m_hot<<std::endl;
    }
}

вывод:

Идентификатор: 300, горячий: 900
ID: 40, горячий: 700
ID: 300, горячий: 200 * +1021 * ID: 30, горячий: 200
ID: 10, горячий: 100

Как видите, идентификатор 40 успешно удалил дубликат, но 300 не удалось. Я думаю, что часть id 300 не должна появляться дважды, может кто-нибудь помочь мне с этим?

1 Ответ

1 голос
/ 12 мая 2019

Ваш operator< не удовлетворяет строгий слабый порядок , и ваши требования не могут быть выражены таким образом.

Проблема в том, что у вас есть два ключа, m_id (для уникальности)и m_hot (для заказа).Вы не можете выбрать заказ только по m_hot.Вы всегда должны упорядочивать (и игнорировать эквивалентные элементы) оба, и вы можете выбрать только приоритет.Таким образом, вы не можете установить эквивалентность между {id=0, hot=0} и {id=0, hot=1}.

^ Если ваш компаратор не может быть записан как std::tie(lhs.keys...) < std::tie(rhs.keys...), это бесполезно.

Вна данный момент я могу думать только об отсрочке заказа на m_hot в нужных вам местах (путем копирования в std::vector и сортировки или вставки в std::set с другим компаратором).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...