#include <iostream>
#include <tr1/memory>
#include <tr1/unordered_map>
using namespace std;
// key to be stored in unordered_map
class data {
public:
char c;
int i;
data(char cc,int ii) {
c=cc;i=ii;
}
};
struct myequal
{
bool operator()(const std::tr1::shared_ptr<data>& lhs, const std::tr1::shared_ptr<data>& rhs) const
{
return lhs->c == rhs->c;
}
};
class myhash {
public:
size_t operator()(const std::tr1::shared_ptr<data> d1 ) const {
std::cout << ">" << std::tr1::hash<int>()(d1->c) << std::endl;
return std::tr1::hash<int>()(d1->c);
}
};
int main() {
std::tr1::unordered_map<std::tr1::shared_ptr<data>, char, myhash, myequal> umap;
//build map
std::tr1::shared_ptr<data> d1( new data('A',1));
umap[d1]='C';
std::tr1::shared_ptr<data> d2( new data('B',1));
umap[d2]='C';
std::tr1::shared_ptr<data> d3(new data('C',1));
umap[d3]='F';
std::tr1::shared_ptr<data> d4(new data('D',1));
umap[d4]='E';
std::tr1::shared_ptr<data> d5(new data('E',1));
umap[d5]='F';
std::tr1::shared_ptr<data> d6(new data('F',1));
umap[d6]='F';
std::cout << "--------------" << std::endl;
for(std::tr1::unordered_map<std::tr1::shared_ptr<data>, char,myhash>::iterator itr = umap.begin(); itr!=umap.end(); itr++) {
if(itr->first->c == itr->second)
continue;
std::tr1::shared_ptr<data> d11( new data(itr->second,0));
std::tr1::unordered_map<std::tr1::shared_ptr<data>, char,myhash>::iterator index = umap.find(d11);
if(index != umap.end())
index->first->i += itr->first->i;
else
std::cout << "NULL" << std::endl;
}
for(std::tr1::unordered_map<std::tr1::shared_ptr<data>, char,myhash>::iterator itr = umap.begin(); itr!=umap.end(); itr++)
std::cout << itr->first->c << " " << itr->first->i << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHIxL21lbW9yeT4KI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIGtleSB0byBiZSBzdG9yZWQgaW4gdW5vcmRlcmVkX21hcApjbGFzcyBkYXRhIHsKICAgIHB1YmxpYzoKICAgIGNoYXIgYzsKICAgIGludCBpOwogICAgZGF0YShjaGFyIGNjLGludCBpaSkgewogICAgICAgYz1jYztpPWlpOwogICAgfQp9OwoKc3RydWN0IG15ZXF1YWwKewpib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp0cjE6OnNoYXJlZF9wdHI8ZGF0YT4mIGxocywgY29uc3QgICBzdGQ6OnRyMTo6c2hhcmVkX3B0cjxkYXRhPiYgcmhzKSBjb25zdAogIHsKICAgIHJldHVybiBsaHMtPmMgPT0gcmhzLT5jOwogIH0KfTsKCmNsYXNzIG15aGFzaCB7CiAgICBwdWJsaWM6CiAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnRyMTo6c2hhcmVkX3B0cjxkYXRhPiBkMSApIGNvbnN0IHsgCiAgICAgICAgc3RkOjpjb3V0IDw8ICI+IiA8PCAgc3RkOjp0cjE6Omhhc2g8aW50PigpKGQxLT5jKSA8PCBzdGQ6OmVuZGw7IAogICAgICAgIHJldHVybiBzdGQ6OnRyMTo6aGFzaDxpbnQ+KCkoZDEtPmMpOyAKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA8c3RkOjp0cjE6OnNoYXJlZF9wdHI8ZGF0YT4sIGNoYXIsIG15aGFzaCwgbXllcXVhbD4gdW1hcDsKICAgIC8vYnVpbGQgbWFwCiAgICBzdGQ6OnRyMTo6c2hhcmVkX3B0cjxkYXRhPiBkMSggbmV3IGRhdGEoJ0EnLDEpKTsKICAgIHVtYXBbZDFdPSdDJzsKICAgIHN0ZDo6dHIxOjpzaGFyZWRfcHRyPGRhdGE+IGQyKCBuZXcgZGF0YSgnQicsMSkpOwogICAgdW1hcFtkMl09J0MnOwogICAgc3RkOjp0cjE6OnNoYXJlZF9wdHI8ZGF0YT4gZDMobmV3IGRhdGEoJ0MnLDEpKTsKICAgIHVtYXBbZDNdPSdGJzsKICAgIHN0ZDo6dHIxOjpzaGFyZWRfcHRyPGRhdGE+IGQ0KG5ldyBkYXRhKCdEJywxKSk7CiAgICB1bWFwW2Q0XT0nRSc7CiAgICBzdGQ6OnRyMTo6c2hhcmVkX3B0cjxkYXRhPiBkNShuZXcgZGF0YSgnRScsMSkpOwogICAgdW1hcFtkNV09J0YnOwogICAgc3RkOjp0cjE6OnNoYXJlZF9wdHI8ZGF0YT4gZDYobmV3IGRhdGEoJ0YnLDEpKTsKICAgIHVtYXBbZDZdPSdGJzsKCiAgICBzdGQ6OmNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tIiA8PCBzdGQ6OmVuZGw7CgogICAgZm9yKHN0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwPHN0ZDo6dHIxOjpzaGFyZWRfcHRyPGRhdGE+LCBjaGFyLG15aGFzaD46Oml0ZXJhdG9yIGl0ciA9IHVtYXAuYmVnaW4oKTsgaXRyIT11bWFwLmVuZCgpOyBpdHIrKykgewogICAgICAgIGlmKGl0ci0+Zmlyc3QtPmMgPT0gaXRyLT5zZWNvbmQpIAogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBzdGQ6OnRyMTo6c2hhcmVkX3B0cjxkYXRhPiBkMTEoIG5ldyBkYXRhKGl0ci0+c2Vjb25kLDApKTsKICAgICAgICBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDxzdGQ6OnRyMTo6c2hhcmVkX3B0cjxkYXRhPiwgY2hhcixteWhhc2g+OjppdGVyYXRvciBpbmRleCA9IHVtYXAuZmluZChkMTEpOwogICAgICAgIGlmKGluZGV4ICE9IHVtYXAuZW5kKCkpCiAgICAgICAgICAgIGluZGV4LT5maXJzdC0+aSArPSBpdHItPmZpcnN0LT5pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJOVUxMIiA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgZm9yKHN0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwPHN0ZDo6dHIxOjpzaGFyZWRfcHRyPGRhdGE+LCBjaGFyLG15aGFzaD46Oml0ZXJhdG9yIGl0ciA9IHVtYXAuYmVnaW4oKTsgaXRyIT11bWFwLmVuZCgpOyBpdHIrKykgCiAgICAgICAgc3RkOjpjb3V0IDw8IGl0ci0+Zmlyc3QtPmMgPDwgIiAiIDw8IGl0ci0+Zmlyc3QtPmkgPDwgc3RkOjplbmRsOwp9