0

C/C++ 混合環境でコーディングしています。C 部分に構造体があり、それを C++ 部分のマップ コンテナーに収集したいと考えています。カスタムのkey_compare関数オブジェクトを定義し、STL map::insert()でノードを注文する必要があると思います。ただし、マップコンテナを変更してmap::find()関数をカスタマイズする方法がわかりません。map::find()関数をカスタマイズして、同等性チェックのために key_compare 関数よりも多くのことを行う方法を探しています。

これらの関数を STL::map または STL::set に入れる方法を教えてください。

これがC部分の私の構造体です(gccでコンパイル):

typedef struct  iotrace_arh_node 
{
    double time;
    unsigned long long int blkno;
    int bcount;
    u_int flags;
    int devno; 
    unsigned long stack_no;
} iotrace_arh_node_t;

ここに、C++ 部分のfind()のkey_compareと同等性チェック関数を提案します ( g++ でコンパイル):

int key_compare ( struct iotrace_arh_node tempa, struct iotrace_arh_node tempb )
{
return (tempa.blkno-tempb.blkno);
}


int key_equal( struct iotrace_arh_node tempa, struct iotrace_arh_node tempb )
{
    if( (tempa.blkno == tempb.blkno) && (tempa.bcount == tempb.bcount) )
        return 0; // tempa and tempb is equal, node fund in the map
    else if ( (tempb.blkno < tempa.blkno)  )
        return -1;  //tempb is less than tempa
    else if ( (tempb.blkno >= tempa.blkno) && ( tempb.blkno + tempb.bcount < tempa.blkno + tempa.bcount) )      
        return 0; // tempa and tempb is equal, node fund in the map
    else
        return 1;  //tempb is grater than tempa
}
4

3 に答える 3

2

標準の比較関数は、C と C++ で異なります。Cでは、あなたが書いたように、最初の引数が2番目の引数より小さい、等しい、または大きい場合、-1、0、または1を返します。しかし、C++ では、< 演算子をオーバーロードするか、< 演算子と同じことを行い、その名前を STL 関数に与える比較関数を作成する必要があります。ただし、 < が推移的であることを確認する必要があります (つまりa<b && b<c => a<c)。これは、key_compare 関数が次のようになることを意味します。

bool key_compare ( const struct iotrace_arh_node& tempa, const struct iotrace_arh_node& tempb )
{
return (tempa.blkno < tempb.blkno);
}

.key_equal を定義する必要はありません(k1 == k2) <=> (!(k1<k2)&&!(k2<k1))。また、挿入時と検索時に異なる比較関数を使用することはできません。

于 2011-04-20T04:43:52.290 に答える
2

型をマップまたはセットのキーとして使用するには、「より小さい」比較を提供する必要があります。これは 2 つの引数を取りtrue、最初の引数が 2 番目の引数の前に来る必要があるかどうかを返します。セットで使用する最も簡単な方法は、関数オブジェクトとして定義することです。

struct key_compare {
    bool operator()(const iotrace_arh_node & a, const iotrace_arh_node & b) {
        return a.blkno < b.blkno;
    }
};

マップまたはセットで「コンパレータ」テンプレート引数として使用します。

typedef std::set<iotrace_arh_node, key_compare> node_set;

キーを比較するさまざまな方法が必要な場合は、さまざまなコンパレータを使用してさまざまなセットを作成できます。ただし、セットの作成後にコンパレータを変更することはできません。セット内のオブジェクトはコンパレータによって定義された順序に従って格納されるため、これを変更するとセットが使用できなくなります。異なるフィールドで同じセットを検索する必要がある場合は、Boost.MultiIndexをご覧ください。

等値比較を提供する必要はありません。

于 2011-04-20T04:50:27.157 に答える
1

比較子については、こちらを参照してください:カスタム比較関数オブジェクトを使用した STL マップ

struct my_comparer
{
   bool operator() ( const struct iotrace_arh_node& left, const struct iotrace_arh_node& right )
   {
      return left.blkno < rigth.blkno);
   }

}

比較子は、単純な関数ではなく、2 項述語でなければなりません。

次に、マップで使用できます。

std::map<Key, Data, Compare, Alloc>

(こちらをご覧ください: http://www.cplusplus.com/reference/stl/map/ )

Compare と Alloc にはデフォルト値があります。

あなたのキータイプは何ですか?

h番目

マリオ

于 2011-04-20T04:46:35.200 に答える