2016-04-23 4 views
-1

Этот код выполняет по-разному, если добавить условие:Вставка пара в станд :: установлен противоречива (не признает <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 

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

+3

Потому что вы ошибались? – juanchopanza

+0

@juanchopanza;) – goelakash

+0

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

ответ

3

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

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

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

+0

Примечание: без использования специализированного компаратора 'std :: set' может различать (a, (b, c)) и (a, (d, e)). – goelakash

 Смежные вопросы

  • Нет связанных вопросов^_^