0

我有一个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 个。

id 1集合中应该只有 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ᵩ 的回答并没有完全解决问题,但我感谢他的努力。

4

3 回答 3

4

由于一条记录不能小于其自身或其等效自身,因此请确保如果两条记录具有相同的 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;
    }
};
于 2013-09-12T14:55:51.620 回答
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;
}
于 2013-09-12T15:05:40.497 回答
0

我知道,我参加聚会迟到了,但我遇到了类似的问题,我想我解决了。Robᵩ 已经在正确的轨道上,但您的原始行也需要修改。总而言之,我想出了以下比较器:

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)确保集合中的唯一条目按其权重排序。

Ideone 上的代码

于 2018-06-06T13:25:36.843 回答