Re: Key strategies for hash_map
I have a hash_map indexed via a std::string. There are times when I
only have the value payload (e.g. key->value) but need to quickly find
it's key. Is it possible to quickly find the key in a hash_map given
it's paired value?
And you have another problem. Is the key:value relationship 1:1 ?
Otherwise there there might not be such think as "the key" for a
value but "the keys" for a value.
If it's 1:1 then may be you really should bind key and value together
in one class node. And hold pointers (or shared_ptr) to O in two
hash_maps. All this could be covered in something like
my_bi_map . But may be then you're very close to boost::multimap then
Don't know.
Something like this for GNU
<snip>
template<class K1,class K2,class HashFn1=std::hash<K1>,class
HashFn2=std::hash<K2> >
class my_bi_map {
public:
typedef std::pair<K1,K2> node;
private:
typedef __gnu_cxx::hash_map<K1,node *,HashFn1> map1_t;
typedef __gnu_cxx::hash_map<K2,node *,HashFn2> map2_t;
map1_t map1;
map2_t map2;
public:
my_bi_map() {
}
// We had ownership
~my_bi_map() {
while( ! map1.empty() ) {
delete *(map1.begin()).second;
map1.erase(map1.begin());
}
}
// add one node
bool add(const node & n) {
if( (map1.find(n.first) == map1.end() &&
map2.find(n.second) != map2.end() )
|| (map1.find(n.first) != map1.end() &&
map2.find(n.second) == map2.end() ) ) {
std::cerr << "Arrg 1:1 criteria violated" << std::endl;
return false;
}
node * nn = new node(n);
map1[n.first] = nn;
map2[n.second] = nn;
return true;
}
bool del1(const K1 & k) {
...
}
bool del1(const K2 & k) {
...
}
const node * get1(const K1 & k) {
...
}
const node * get2(const K2 & 2) {
...
}
};
</snip>
O.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]