fork(1) download
  1. #include <iostream>
  2. #include <tr1/memory>
  3. #include <tr1/unordered_map>
  4.  
  5. using namespace std;
  6.  
  7. // key to be stored in unordered_map
  8. class data {
  9. public:
  10. char c;
  11. int i;
  12. data(char cc,int ii) {
  13. c=cc;i=ii;
  14. }
  15. };
  16.  
  17. struct myequal
  18. {
  19. bool operator()(const std::tr1::shared_ptr<data>& lhs, const std::tr1::shared_ptr<data>& rhs) const
  20. {
  21. return lhs->c == rhs->c;
  22. }
  23. };
  24.  
  25. class myhash {
  26. public:
  27. size_t operator()(const std::tr1::shared_ptr<data> d1 ) const {
  28. std::cout << ">" << std::tr1::hash<int>()(d1->c) << std::endl;
  29. return std::tr1::hash<int>()(d1->c);
  30. }
  31. };
  32.  
  33. int main() {
  34. std::tr1::unordered_map<std::tr1::shared_ptr<data>, char, myhash, myequal> umap;
  35. //build map
  36. std::tr1::shared_ptr<data> d1( new data('A',1));
  37. umap[d1]='C';
  38. std::tr1::shared_ptr<data> d2( new data('B',1));
  39. umap[d2]='C';
  40. std::tr1::shared_ptr<data> d3(new data('C',1));
  41. umap[d3]='F';
  42. std::tr1::shared_ptr<data> d4(new data('D',1));
  43. umap[d4]='E';
  44. std::tr1::shared_ptr<data> d5(new data('E',1));
  45. umap[d5]='F';
  46. std::tr1::shared_ptr<data> d6(new data('F',1));
  47. umap[d6]='F';
  48.  
  49. std::cout << "--------------" << std::endl;
  50.  
  51. for(std::tr1::unordered_map<std::tr1::shared_ptr<data>, char,myhash>::iterator itr = umap.begin(); itr!=umap.end(); itr++) {
  52. if(itr->first->c == itr->second)
  53. continue;
  54. std::tr1::shared_ptr<data> d11( new data(itr->second,0));
  55. std::tr1::unordered_map<std::tr1::shared_ptr<data>, char,myhash>::iterator index = umap.find(d11);
  56. if(index != umap.end())
  57. index->first->i += itr->first->i;
  58. else
  59. std::cout << "NULL" << std::endl;
  60. }
  61.  
  62. for(std::tr1::unordered_map<std::tr1::shared_ptr<data>, char,myhash>::iterator itr = umap.begin(); itr!=umap.end(); itr++)
  63. std::cout << itr->first->c << " " << itr->first->i << std::endl;
  64. }
Success #stdin #stdout 0s 3280KB
stdin
Standard input is empty
stdout
>65
>66
>67
>68
>69
>70
--------------
>67
>70
>69
>70
>67
B 1
C 3
D 1
E 2
F 5
A 1