2013-09-12 2 views
0

У меня есть vector < pair <double, int> >, здесь double представляет вес человека и int представляет собой идентификатор этого человека.std :: набор, содержащий пару с обычным компаратором

Теперь мне нужно его преобразовать в set < pair < double, int > >, чтобы удалить дубликаты на основе id этого человека, но внутри вектора у меня есть данные с некоторой степенью точности.

Пример:

----------------------- 
    double | int 
----------------------- 
    10.234 | 1  <-- 
    20.123 | 2 
    10.2 | 1  <-- 
    30.33 | 3 

Как мы можем видеть, id 1 имеет вес в разной точностью.

Использования компаратора по умолчанию так std::set приведет с 4 элементов в наборе, но мне нужно только 3.

только один элемент с id 1 должен быть там в наборе (любой из двух конкурентов будут делать) ,

Примечание: Причина, по которой я не использую std::map, состоит в том, что мне нужно, чтобы она была в определенной последовательности. Вот компаратор, который я уже использую для заказа, которого хочу.

struct comp__f { 
    bool operator() (const pair<double, int>& lhs, const pair<double, int>& rhs) const{ 
     if(lhs.first < rhs.first) return true; 
     if(lhs.first > rhs.first) return false; 
     return lhs.second > rhs.second; 
    } 
}; 

Update: Мне нужно, чтобы заказать по весу, что причина, я использую выше компаратор

UPDATE2: Вопрос остается открытым, @ ответ Robᵩ в не полностью решить проблему, но я ценю его усилие.

+0

Что такое «определенная последовательность» вам нужен набор, чтобы иметь? –

ответ

3

Поскольку запись не может быть меньше самой себя или ее эквивалентного «я», убедитесь, что ваша функция comp возвращает false, если две записи имеют одинаковый идентификатор, независимо от веса.

// Assuming that your previous comp_f was correct, here is the new one: 
struct comp__f { 
    bool operator() (const pair<double, int>& lhs, const pair<double, int>& rhs) const{ 
     if(lhs.second == rhs.second) return false; // ADD THIS LINE 
     if(lhs.first < rhs.first) return true; 
     if(lhs.first > rhs.first) return false; 
     return lhs.second > rhs.second; 
    } 
}; 
+1

Добавление этой строки приведет к изменению порядка элементов, но набор все равно будет содержать 4 элемента. нет? – Jaydeep

+0

@ Jaydeep вы пробовали? Похоже, он должен работать. – juanchopanza

+0

@Jaydeep - Нет. Добавив эту строку, набор будет содержать только 3 элемента. 'set' будет наблюдать, что' {10.234, 1} <{10.2, 1} 'ложно и что' {10.2, 1} <{10.234, 1} 'также неверно. Он справедливо сделает вывод, что элементы идентичны и отказываются вставлять последний. (По крайней мере, это было бы так, если бы это было антропоморфно.) –

0

Попробовать это

#include<set> 
#include<iostream> 
using namespace std; 

class CustomComparitor 
{ 
    public: 
     int operator()(const pair<double,int>& lhs, const pair<double,int>& rhs) 
     { 
      return lhs.second < rhs.second; 
     } 
}; 
int main() 
{ 
    set<pair<double,int>,CustomComparitor> myset; 
    myset.insert(make_pair(1.4, 2)); 
    myset.insert(make_pair(1.5, 2)); 
    myset.insert(make_pair(1.6, 1)); 
    myset.insert(make_pair(1.4, 3)); 

    for(auto itr = myset.begin(); itr!=myset.end();itr++) 
    { 
     cout<<itr->first<<" "<<itr->second<<endl; 
    } 
    return 0; 
} 
+0

Кажется очень похожим на то, что я ответил 9 мин. тому назад. Но, оказывается, OP требует, чтобы элементы упорядочивались по весу. – juanchopanza

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