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