Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <exception>
  4. #include <stdexcept>
  5. #include <assert.h>
  6. #define SIZE 10
  7.  
  8. class HashEntry {
  9. public:
  10. int _k;
  11. int _v;
  12. HashEntry(int k, int v) : _k(k), _v(v) {};
  13. };
  14.  
  15.  
  16. class HashMap {
  17. private:
  18. std::vector<HashEntry> buckets[SIZE];
  19. int hashFunc(int key);
  20. std::vector<HashEntry>& getBucket(int key);
  21.  
  22. public:
  23. bool keyExists(int k);
  24. HashEntry get(int k);
  25. bool put(int k, int v);
  26. bool remove(int k);
  27. };
  28.  
  29. int HashMap::hashFunc(int key) {
  30. return key % SIZE;
  31. }
  32.  
  33. std::vector<HashEntry>& HashMap::getBucket(int key) {
  34. if (key < 0) {
  35. throw std::runtime_error("key should be >= 0");
  36. }
  37. return buckets[hashFunc(key)];
  38. }
  39.  
  40. HashEntry HashMap::get(int k) {
  41. std::vector<HashEntry>& bucket = getBucket(k);
  42. for (HashEntry entry : bucket) {
  43. if (entry._k == k) {
  44. return entry;
  45. }
  46. }
  47. throw std::runtime_error("Key not found");
  48. }
  49. bool HashMap::keyExists(int k) {
  50. std::vector<HashEntry>& bucket = getBucket(k);
  51. for (HashEntry entry : bucket) {
  52. if (entry._k == k) {
  53.  
  54. // key already exists
  55. return true;
  56. }
  57. }
  58. return false;
  59. }
  60.  
  61. bool HashMap::put(int k, int v) {
  62. std::vector<HashEntry>& bucket = getBucket(k);
  63. if (keyExists(k)) return false;
  64. bucket.push_back(HashEntry(k, v));
  65. return true;
  66. }
  67.  
  68. bool HashMap::remove(int k) {
  69. std::vector<HashEntry>& bucket = getBucket(k);
  70. if (!(keyExists(k))) return false;
  71. for (auto itr = bucket.begin(); itr != bucket.end(); ++itr) {
  72. HashEntry entry = static_cast<HashEntry>(*itr);
  73. if (entry._k == k) {
  74. bucket.erase(itr);
  75. return true;
  76. break;
  77. }
  78. }
  79. return false;
  80. }
  81.  
  82. int main() {
  83. HashMap map;
  84. for (int i=0; i < 10; ++i) {
  85. assert(map.put(i, i*10));
  86. }
  87. for (int i=0; i < 10; ++i) {
  88. assert(map.keyExists(i) == true);
  89. }
  90. assert(map.keyExists(0) == true);
  91. assert(map.get(0)._v == 0);
  92. assert(map.remove(0) == true);
  93. assert(map.remove(0) == false);
  94. assert(map.keyExists(0) == false);
  95.  
  96. bool exceptionThrown = false;
  97. try {
  98. map.get(0);
  99. } catch (std::exception &e) {
  100. exceptionThrown = true;
  101. };
  102. assert(exceptionThrown);
  103. return 1;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement