我有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ᵩ的答案并没有完全解决问题,但我很感激他的努力。
答案 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)
确保集合中的唯一条目按其权重排序。