std :: set包含自定义比较器对

时间:2013-09-12 14:53:17

标签: c++ stl operator-overloading stdvector std-pair

我有vector < pair <double, int> >,其中double代表一个人的体重,int代表该人的身份。

现在我需要将其转换为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个。

集合中只有1个带有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;
    }
};

注意:问题仍然存在,@Robᵩ的答案并没有完全解决问题,但我很感激他的努力。

3 个答案:

答案 0 :(得分:3)

由于记录不能小于其本身或其等效的自身,因此如果两条记录具有相同的ID,请确保您的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 :(得分: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;
}

答案 2 :(得分:0)

我知道,我已经迟到了,但我遇到了类似的问题,我想我已经解决了。 Robᵩ was already on the right track,但您的原始线条也需要修改。总而言之,我提出了以下比较器:

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

正如Robᵩ所解释的,(lhs.second != rhs.second)部分确保ID是唯一的。如果这是有保证的,那么您只需要使用<来比较权重。因此,(lhs.first < rhs.first)确保集合中的唯一条目按其权重排序。

Code on Ideone