0

さて、私の問題は、次のようなカスタムコンパレータで std::set を使用していることです。

class A
{
public:
    A(int x, int y):
        _x(x), _y(y)
    {
    }

    int hashCode(){ return (_y << 16) | _x; }

private:
    short int _y;
    short int _x;
};

struct comp
{
    bool operator() (A* g1, A* g2) const
    {
        return g1->hashCode() < g2->hashCode();
    }
};

だから、私はそれを次のように使用します

std::set<A*, comp> myset;

// Insert some data
A* a = new A(2,1);
A* b = new A(1,3);
myset.insert(a);
myset.insert(b);

今私の問題は、私がこれをしたいということです:

myset.find( (2 << 16) | 1 );

ただし、もちろん、short int ではなく A* を除きます。

したがって、std::find_if を使用できることはわかっていますが、カスタム コンパレータが役に立たなくなるのではないでしょうか? リスト全体を反復しますよね?オブジェクト自体ではなく、hashCode で find を使用できる方法はありますか?

ありがとうございました!

4

4 に答える 4

1

は (メンバ) テンプレートではないstd::setため、 でこれを行うことはできません。std::set<>::find引数は鍵の型でなければなりません。あなたのような単純なクラスの場合、 を使用し std::vector<A>てソートしたままにしておく (std::lower_bound ルックアップに使用し、挿入ポイントとして使用する) と同じくらい高速になる可能性があります。を使用するとstd::lower_boundコンパレータを渡して、 任意のタイプをキーとして使用できます。あなたがしなければならないことは、クラスが混合型比較を処理できることを確認することです。comp

struct Comp
{
    bool operator()( A const&, B const& ) const;
    bool operator()( A const&, int ) const;
    bool operator()( int, A const& ) const;
};
于 2013-05-02T12:11:04.603 に答える
0
myset.find(&A(2, 1));

または

A a(2, 1);
myset.find(&a);
于 2013-05-02T12:11:08.010 に答える
0

を定義したstd::set<A*, comp> myset;ので、引数std::find()を取る必要があります。A*

std::set<A*, comp> myset;

// Insert some data
A* a = new A(2,1);
A* b = new A(1,3);
myset.insert(a);
myset.insert(b);

次に、あなたがする必要があります

myset.find(&A(2,1))

質問に戻りますstd::find()が、カスタム コンパレータを使用していません。実際、使用する必要がありますstd::find_if

于 2013-05-02T15:46:05.933 に答える