Вставка пары в std::set не согласована (не распознает <pair>.second)

Этот код работает по-другому, если я добавлю условие:

Первый случай:

#include<bits/stdc++.h>
using namespace std;

struct comp
{
    bool operator()(pair<int,pair<int,int> > a, pair<int,pair<int,int> > b)
    {
        return a.first>b.first;
    }
};

int main()
{
    set<pair<int,pair<int,int>>,comp> s;
    auto d = s.insert({4,{6,10}});
    cout<<(d.first)->first<<" "<<(d.first)->second.first<<" "<<(d.first)->second.second<<endl;
    d = s.insert({4,{0,4}});
    cout<<(d.first)->first<<" "<<(d.first)->second.first<<" "<<(d.first)->second.second<<endl;
}

Выход:

4 6 10
4 6 10

Второй случай: (с условием.second)

#include<bits/stdc++.h>
using namespace std;

struct comp
{
    bool operator()(pair<int,pair<int,int> > a, pair<int,pair<int,int> > b)
    {
        if(a.first==b.first)
            return a.second.first<b.second.first;
        return a.first>b.first;
    }
};

int main()
{
    set<pair<int,pair<int,int>>,comp> s;
    auto d = s.insert({4,{6,10}});
    cout<<(d.first)->first<<" "<<(d.first)->second.first<<" "<<(d.first)->second.second<<endl;
    d = s.insert({4,{0,4}});
    cout<<(d.first)->first<<" "<<(d.first)->second.first<<" "<<(d.first)->second.second<<endl;
}

Выход:

4 6 10
4 0 4

Почему сет не добавляет другую пару в первом случае? Я думал, что дополнительное условие только определяет порядок и не делает различий между элементами.

1 ответ

Решение

Ваш первый компаратор принимает во внимание только первый элемент пары. Когда вы пытаетесь вставить вторую пару, она считается равной уже вставленной паре и, следовательно, не вставлена.

Вместо этого вы возвращаете объект, который уже был вставлен в набор, что является ожидаемым поведением.

Помните, что набор по определению имеет только один экземпляр конкретного объекта, и ваш компаратор помогает ему определить, как два объекта сравниваются друг с другом.

Другие вопросы по тегам