我在混合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
}

最佳答案

要将类型用作映射或集中的键,您需要提供“小于”比较,该比较采用两个参数,如果第一个应在第二个之前,则返回true。在集合中使用它的最简单方法是将其定义为函数对象:

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

您无需提供相等性比较。

关于c++ - ANSI C中定义的结构的STL映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5725506/

10-17 01:37