What I would like to do is have a map that maps integer keys to priority_queues of pointers to a struct I have defined sorted by a comparison function I have also defined.
That is, the type would be something like this,
map<int, priority_queue<object_t*, compare> > my_map;
where you may assume object_t is the my defined struct, and compare is a comparison function returning a boolean value.
Is there a way I can declare my_map to have the priority_queues already initialized with the comparison function? For example, can I declare it so that开发者_C百科 I can do the following,
my_map[1].push(object_ptr);
my_map[1].push(object_ptr1);
and trust that the two object pointers have been ordered correctly in the priority_queue?
Thanks
What is "compare"? If it's a function pointer, you must be very careful to not use it before you supply a value, as the default constructed priority_queue will use a null pointer. The easiest way to ensure non-null pointers – if you cannot rewrite or wrap as shown below – is, ironically, to never use the index operator; instead use the find and insert methods.
If "compare" is instead a functor, then it should be written so its default construction does exactly what's needed (often nothing) – it is very rare for this to not be possible.
Once the comparator in the priority_queue has a proper value (e.g. not a null pointer in the pointer case), then you can be sure your objects will be ordered correctly.
If you have a fixed function and are using function pointers:
bool my_compare(object_t *a, object_t *b) {
// do something
}
typedef bool (*compare)(object_t*, object_t*);
Rewrite to:
struct compare {
bool operator()(object_t *a, object_t *b) {
// do something
}
};
If you cannot rewrite the function to be a comparator (e.g. it's from some third-party library), you can wrap a (fixed) function pointer in a comparator:
bool my_compare(object_t*, object_t*);
struct compare {
bool operator()(object_t *a, object_t *b) {
return my_compare(a, b);
}
};
精彩评论