事实证明一个能够自动扩展的顺序表/线性表也是可以折腾人的0u0

显示/移除行号
  1. //编译时请加入参数 --std=c++11
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. namespace cus {
  7. template<typename T>
  8. class Vector
  9. {
  10. T* v;
  11. size_t length;
  12. size_t cap;
  13. void rearrange(size_t logLen)
  14. {
  15. size_t newLen =( 1 << logLen);
  16. if (newLen > cap)
  17. {
  18. T* from = v;
  19. T* to = static_cast<T*>(malloc(sizeof(T)*newLen));
  20. memcpy(to, from, sizeof(T)*length);
  21. free(v);
  22. v = to;
  23. }
  24. cap = newLen;
  25. }
  26. void reallocate(size_t n)
  27. {
  28. rearrange(1+ static_cast<int>(log2(n)));
  29. }
  30. public:
  31. Vector() :v(nullptr), length(0), cap(0) {}
  32. Vector(T* ori, size_t len)
  33. {
  34. reallocate(len);
  35. memcpy(v, ori, sizeof(T)*len);
  36. }
  37. Vector(T* ori, size_t from, size_t len)
  38. {
  39. reallocate(len);
  40. memcpy(&v[from], ori, sizeof(T)*len);
  41. }
  42. void resize(size_t n)
  43. {
  44. reallocate(n);
  45. for (int i = length;i < n;++i)
  46. {
  47. v[i] = 0;
  48. }
  49. length = n;
  50. }
  51. void push_back(const T &x)
  52. {
  53. if (length + 1 >= cap)reallocate(length + 1);
  54. v[length++] = x;
  55. }
  56. friend std::ostream& operator <<(std::ostream& os,Vector a)
  57. {
  58. for (unsigned i = 0;i < a.size();++i)
  59. {
  60. os << a[i] << " ";
  61. }
  62. return os;
  63. }
  64. inline size_t size() const {
  65. return length;
  66. }
  67. inline size_t capacity() const {
  68. return cap;
  69. }
  70. bool empty() const
  71. {
  72. return size() == 0;
  73. }
  74. T& at(size_t index)
  75. {
  76. if (index >= length)return v[0];
  77. return v[index];
  78. }
  79. T& operator [](size_t index)
  80. {
  81. if (index >= length)return v[0];
  82. return v[index];
  83. }
  84. T* find(const T &x) const
  85. {
  86. for (unsigned i = 0;i < length;++i)
  87. {
  88. if (v[i] == x)
  89. {
  90. return &v[i];
  91. }
  92. }
  93. return nullptr;
  94. }
  95. size_t find_index(const T &x) const
  96. {
  97. auto rtn = find(x);
  98. if (rtn == nullptr)return static_cast<size_t>(-1);
  99. return x;
  100. }
  101. T* insert(const T* pos,const T& x)
  102. {
  103. if (length + 1 >= cap)reallocate(length + 1);
  104. size_t id = pos - v;
  105. if (id >= length)return nullptr;
  106. for (auto i =id;i < length;++i)
  107. {
  108. v[i+1] = v[i];
  109. }
  110. ++length;
  111. v[id] = x;
  112. return &v[id];
  113. }
  114. T* insert(size_t index, const T& x)
  115. {
  116. return insert(v + index, x);
  117. }
  118. T* erase(const T* pos)
  119. {
  120. size_t id = pos - v;
  121. if (id >= length)return nullptr;
  122. --length;
  123. for (unsigned i = id;i < length;++i)
  124. {
  125. v[i] = v[i+1];
  126. }
  127. return &v[id];
  128. }
  129. T* erase(size_t index)
  130. {
  131. return erase(v + index);
  132. }
  133. ~Vector()
  134. {
  135. if (v == nullptr)return;
  136. free(v);
  137. }
  138. };
  139. }
  140. int main()
  141. {
  142. std::cout<<"(1)初始化顺序表L;"<<std::endl;
  143. cus::Vector<char> L;
  144. std::cout<<"(2)依次采用尾插法插入a, b, c, d, e元素;"<<std::endl;
  145. char a, b, c, d, e;
  146. std::cin >> a >> b >> c >> d >> e;
  147. L.push_back(a);
  148. L.push_back(b);
  149. L.push_back(c);
  150. L.push_back(d);
  151. L.push_back(e);
  152. std::cout<<"(3)输出顺序表L;"<<std::endl;
  153. std::cout << L << std::endl;
  154. std::cout<<"(4)输出顺序表L长度;"<<std::endl;
  155. std::cout << "size:" << L.size() << std::endl;
  156. std::cout<<"(5)判断顺序表L是否为空;"<<std::endl;
  157. std::cout << "isEmpty:" << L.empty() << std::endl;
  158. std::cout<<"(6)输出顺序表L的第3个元素;"<<std::endl;
  159. std::cout << L << std::endl;
  160. std::cout << "3rd:" << L[2] << std::endl;
  161. std::cout<<"(7)输出元素'a'的位置;"<<std::endl;
  162. std::cout << "a is at:" << L.find_index('a') << std::endl;
  163. std::cout<<"(8)在第4个元素位置上插入'f'元素;"<<std::endl;
  164. L.insert(3, 'f');
  165. std::cout<<"(9)输出顺序表L;"<<std::endl;
  166. std::cout << L << std::endl;
  167. std::cout<<"(10)删除L的第3个元素;"<<std::endl;
  168. L.erase(2);
  169. std::cout<<"(11)输出顺序表L;"<<std::endl;
  170. std::cout << L << std::endl;
  171. std::cout<<"(12)释放顺序表L。"<<std::endl;
  172. system("pause");
  173. return 0;
  174. }

著作权声明[编辑]

关于[编辑]