• C++ day7


    1、手动实现vector

    1. #include
    2. using namespace std;
    3. template<typename T>
    4. class myVector
    5. {
    6. private:
    7. T* arr;
    8. size_t size; //元素个数
    9. size_t capacity; //数组容量
    10. public:
    11. //构造函数
    12. myVector() :arr(nullptr), size(0), capacity(0) {}
    13. myVector(int size)
    14. {
    15. if (size > 0)
    16. {
    17. this->capacity = size;
    18. this->arr = new T[capacity];
    19. }
    20. if (size < 0)
    21. {
    22. throw double(1);
    23. }
    24. }
    25. myVector(const myVector& other) :size(other.size), capacity(other.capacity)
    26. {
    27. if (this != &other)
    28. {
    29. arr = new T[capacity];
    30. for (size_t i = 0; i < size; i++)
    31. {
    32. arr[i] = other.arr[i];
    33. }
    34. }
    35. }
    36. //析构函数
    37. ~myVector()
    38. {
    39. delete[] arr;
    40. }
    41. //获取当前元素的个数
    42. size_t getSize()const
    43. {
    44. return size;
    45. }
    46. //获取当前容量
    47. size_t getcapacity()const
    48. {
    49. return capacity;
    50. }
    51. //返回最后一个元素
    52. T back()const
    53. {
    54. return arr[size - 1];
    55. }
    56. //判空
    57. bool isEmpty()
    58. {
    59. return size == 0;
    60. }
    61. //尾插
    62. void push_back(const T& value)
    63. {
    64. if (size >= capacity)
    65. {
    66. //进行扩容
    67. size_t new_max_size = (capacity == 0) ? 1 : capacity * 2;
    68. T* newArr = new T[new_max_size];
    69. for (size_t i = 0; i < size; i++)
    70. {
    71. newArr[i] = arr[i];
    72. }
    73. delete[] arr;
    74. arr = newArr;
    75. capacity = new_max_size;
    76. }
    77. arr[size++] = value;
    78. }
    79. //返回指定位置的元素
    80. T& operator[](size_t index)
    81. {
    82. if (index >= size)
    83. {
    84. throw double(3);
    85. }
    86. return arr[index];
    87. }
    88. //删除最后一个元素
    89. void pop_back()
    90. {
    91. if (!isEmpty())
    92. {
    93. --size;
    94. }
    95. }
    96. //删除任意元素
    97. void erase(size_t index)
    98. {
    99. if (index >= size)
    100. {
    101. throw double(5);
    102. }
    103. for (size_t i = index; i < size - 1; ++i)
    104. {
    105. arr[i] = arr[i + 1];
    106. }
    107. --size;
    108. //可以减少数组的容量
    109. if (size < capacity / 4)
    110. {
    111. size_t new_max_size = capacity / 2;
    112. T* newArr = new T[new_max_size];
    113. for (size_t i = 0; i < size; ++i)
    114. {
    115. newArr[i] = arr[i];
    116. }
    117. delete[] arr;
    118. arr = newArr;
    119. capacity = new_max_size;
    120. }
    121. }
    122. //返回第一个元素
    123. T front()const
    124. {
    125. return arr[0];
    126. }
    127. //调整容器的大小
    128. void resize(size_t newSize)
    129. {
    130. if (newSize < 0)
    131. {
    132. throw double(7);
    133. }if (newSize == size)
    134. {
    135. return;
    136. }
    137. if (newSize < size)
    138. {
    139. size = newSize;
    140. }
    141. else
    142. {
    143. if (newSize > capacity)
    144. {
    145. // 如果新大小大于容量,需要重新分配内存
    146. size_t new_capacity = (newSize > capacity* 2) ? newSize : capacity * 2;
    147. T* newArr = new T[new_capacity];
    148. for (size_t i = 0; i < size; ++i)
    149. {
    150. newArr[i] = arr[i];
    151. }
    152. delete[] arr;
    153. arr = newArr;
    154. capacity = new_capacity;
    155. }
    156. while (size < newSize)
    157. {
    158. push_back(T());
    159. }
    160. }
    161. }
    162. };
    163. int main() {
    164. try {
    165. size_t size;
    166. cout<<"请设置容器的最大容量:";
    167. cin>>size;
    168. myVector<int> vec(size);
    169. // 添加元素
    170. for (int i = 1; i <= 10; ++i) {
    171. vec.push_back(i);
    172. }
    173. // 访问和打印元素
    174. cout << "当前容器中的元素为: ";
    175. for (size_t i = 0; i < vec.getSize(); ++i) {
    176. cout << vec[i] << " ";
    177. }
    178. cout << endl;
    179. cout<<"当前容器的容量为:"<getcapacity()<
    180. // 测试 front 和 back 函数
    181. cout << "第一个元素为: " << vec.front() << endl;
    182. cout << "最后一个元素为: " << vec.back() << endl;
    183. // 删除最后一个元素
    184. vec.pop_back();
    185. // 访问和打印元素
    186. cout << "删除最后一个元素后容器中的元素为: ";
    187. for (size_t i = 0; i < vec.getSize(); ++i) {
    188. cout << vec[i] << " ";
    189. }
    190. cout << endl;
    191. int num;
    192. cout<<"请输入删除第几个元素:";
    193. cin>>num;
    194. // 删除指定位置的元素
    195. vec.erase(--num); // 删除第三个元素
    196. // 访问和打印元素
    197. cout << "删除后容器中的元素为: ";
    198. for (size_t i = 0; i < vec.getSize(); ++i) {
    199. cout << vec[i] << " ";
    200. }
    201. cout << endl;
    202. // 调整容器大小
    203. int a;
    204. cout<<"设置容器大小:";
    205. cin>>a;
    206. vec.resize(a);
    207. // 访问和打印元素
    208. cout << "调整容器大小后容器中的元素为: ";
    209. for (size_t i = 0; i < vec.getSize(); ++i) {
    210. cout << vec[i] << " ";
    211. }
    212. cout << endl;
    213. cout<<"当前容器的容量为:"<getcapacity()<
    214. }
    215. catch (double e) {
    216. cout << "Error: " << e << endl;
    217. }
    218. return 0;
    219. }

    二、思维导图

  • 相关阅读:
    CSS便捷小工具
    Docker pull Images遇到的问题解决
    数据结构--树
    tomcat (SCI)ServletContainerInitializer 的加载原理
    C++:使用cin.getline()输入超过规定字符数
    面试算法题之旋转置换,旋转跳跃我闭着眼
    华纳云:负载均衡服务器的作用是什么 有哪些方式
    FJSP:小龙虾优化算法(Crayfsh optimization algorithm,COA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码
    【红队】ATT&CK - 文件隐藏
    java计算机毕业设计基于安卓/Android/微信小程序的校园外卖点餐APP
  • 原文地址:https://blog.csdn.net/Lychee_z23/article/details/132890150