0

は人の体重をvector < pair <double, int> >表し、その人のIDを表します。doubleint

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必要があります (2 つの競合他社の誰でも構いません)。

私が使用していない理由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

レコードはそれ自体またはそれと同等の自己よりも小さいことはできないため、重みに関係なく、2 つのレコードが同じ 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 に答える