• C++day7


     仿照vector手动实现自己的myVector,最主要实现二倍扩容功能

    代码

    头文件

    1. #ifndef TEST_H
    2. #define TEST_H
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. template <typename T>
    8. class Myvector
    9. {
    10. public:
    11. Myvector(); //无参构造
    12. Myvector(int n,const T num); //有参构造
    13. Myvector(const Myvector &other);//拷贝构造
    14. ~Myvector(); //析构函数
    15. int capacity(); //返回当前所能容纳的元素个数
    16. void push_back(const T &num); //在末尾插入元素
    17. int size_data(); //返回当前存储的元素个数
    18. void assign(int n,const T num); //向容器中赋值
    19. T& at(int pos); //返回指定位置的数据
    20. void clear(); //清空
    21. bool empty(); //判空
    22. T& front(); //返回第一个数据
    23. T& back(); //返回最后一个数据
    24. T* begin(); //返回第一个数据的地址
    25. T* end(); //返回最后一个数据的地址
    26. T* insert(T* p,const T& num); //指定位置插入数据
    27. void pop_back(); //删除最后一个数据
    28. void show(); //遍历
    29. private:
    30. T* data; //存数据
    31. int size; //存储数据个数最大值
    32. int number; //存储当前数据个数
    33. };
    34. #endif // TEST_H

    源代码

    1. #include "test.h"
    2. template <typename T>
    3. Myvector<T>::Myvector():data(new T),size(1),number(0){} //无参构造
    4. template <typename T>
    5. Myvector<T>::Myvector(int n,const T num) //有参构造
    6. {
    7. //输入了n个数据
    8. size = n;
    9. number = n;
    10. data = new T[n];
    11. for (int i = 0; i < n; ++i) //将申请到的空间都赋值为num
    12. {
    13. data[i] = num;
    14. }
    15. }
    16. template <typename T>
    17. Myvector<T>::Myvector(const Myvector &other)//拷贝构造
    18. {
    19. size = other.size;
    20. data = new T[other.size];
    21. for (int i = 0; i < other.size; ++i)
    22. {
    23. data[i] = other.data[i];
    24. }
    25. }
    26. template <typename T>
    27. Myvector<T>::~Myvector() //析构函数
    28. {
    29. delete []data;
    30. }
    31. template <typename T>
    32. int Myvector<T>::capacity() //返回当前所能容纳的元素个数
    33. {
    34. return size;
    35. }
    36. template <typename T>
    37. void Myvector<T>::push_back(const T &num) //在末尾插入元素
    38. {
    39. if(number == size) //判断当前是否已满
    40. {
    41. int i = 0;
    42. T* data_new = new T[size*2]; //二倍扩容
    43. size = size * 2;
    44. while(i < number) //将旧区的数据内容赋给新区
    45. {
    46. data_new[i] = data[i];
    47. i++;
    48. }
    49. delete []data; //释放旧区
    50. data = data_new; //指向新区
    51. data_new = nullptr; //新指针置空
    52. data[number] = num; //插入元素
    53. number++; //存储数量加1
    54. }
    55. else if(number < size)
    56. {
    57. data[number] = num;
    58. number++;
    59. }
    60. }
    61. template <typename T>
    62. int Myvector<T>::size_data() //返回当前存储的元素个数
    63. {
    64. return number;
    65. }
    66. template <typename T>
    67. void Myvector<T>::assign(int n,const T num) //向容器中赋值
    68. {
    69. if(n > size) //判断要重写的数据个数是否最大存储个数
    70. {
    71. int i = 0;
    72. while(n > size)
    73. { //之前的空间不够,释放并重新给空间
    74. delete []data;
    75. data = nullptr;
    76. data = new T[size*2]; //二倍扩容
    77. size = size * 2;
    78. }
    79. while(i < n) //循环赋值
    80. {
    81. data[i] = num;
    82. i++;
    83. }
    84. number = n; //存储数量改变
    85. }
    86. else if(n < size)
    87. {
    88. int i = 0;
    89. while(i < n) //循环赋值
    90. {
    91. data[i] = num;
    92. i++;
    93. }
    94. if(n > number) //如果重写个数大于已有个数
    95. {
    96. number = n; //更新已有个数
    97. }
    98. }
    99. }
    100. template <typename T>
    101. T& Myvector<T>::at(int pos) //返回指定位置的数据
    102. {
    103. if(pos > number || pos < 0)
    104. {
    105. throw T(1); //抛出异常
    106. }
    107. else
    108. {
    109. return data[pos-1]; //返回指定位置数据
    110. }
    111. }
    112. template <typename T>
    113. void Myvector<T>::clear() //清空
    114. {
    115. memset(data,0,sizeof(data[0])*size);
    116. number = 0;
    117. }
    118. template <typename T>
    119. bool Myvector<T>::empty() //判空
    120. {
    121. return number == 0;
    122. }
    123. template <typename T>
    124. T& Myvector<T>::front() //返回第一个数据
    125. {
    126. return data[0];
    127. }
    128. template <typename T>
    129. T& Myvector<T>::back() //返回最后一个数据
    130. {
    131. return data[number-1];
    132. }
    133. template <typename T>
    134. T* Myvector::begin() //返回第一个数据的地址
    135. {
    136. return &data[0];
    137. }
    138. template <typename T>
    139. T* Myvector::end() //返回最后一个数据的地址
    140. {
    141. return &data[number];
    142. }
    143. template <typename T>
    144. T* Myvector::insert(T* p,const T& num) //指定位置插入数据
    145. {
    146. int j = 0;
    147. while(&data[0]+j != p) //寻找输入的是第几个数据的地址
    148. {
    149. j++;
    150. }
    151. if(number == size || j+1 > size) //判断当前是否已满
    152. {
    153. int i = 0;
    154. T* data_new = new T[size*2]; //二倍扩容
    155. size = size * 2;
    156. while(i < number) //将旧区的数据内容赋给新区
    157. {
    158. data_new[i] = data[i];
    159. i++;
    160. }
    161. delete []data; //释放旧区
    162. data = data_new; //指向新区
    163. data_new = nullptr; //新指针置空
    164. //将指定位置之后的数据全都后移一位
    165. for(int k = number,i = j;i < number;i++,k--)
    166. {
    167. data[k] = data[k-1];
    168. }
    169. data[j] = num; //插入元素
    170. number++; //存储数量加1
    171. return &data[j];
    172. }
    173. else if(number < size && j < size)
    174. {
    175. //将指定位置之后的数据全都后移一位
    176. for(int k = number,i = j;i < number;i++,k--)
    177. {
    178. data[k] = data[k-1];
    179. }
    180. data[j] = num; //插入元素
    181. number++; //存储数量加1
    182. return &data[j];
    183. }
    184. }
    185. template <typename T>
    186. void Myvector<T>::pop_back() //删除最后一个数据
    187. {
    188. number--;
    189. }
    190. template <typename T>
    191. void Myvector<T>::show() //遍历
    192. {
    193. int i = 0;
    194. for(;i < number;i++)
    195. {
    196. cout << data[i] << "\t";
    197. }
    198. cout << endl;
    199. }

    测试函数

    1. #include "test.h"
    2. #include "test.cpp"
    3. int main()
    4. {
    5. Myvector<int> v1(6,3);
    6. v1.show();
    7. cout << "1当前能够容纳的元素个数:" << v1.capacity() << endl;
    8. v1.push_back(5); //在末尾插入一个数
    9. v1.show();
    10. cout << "最后一个元素:" << v1.at(7) << endl;
    11. cout << "2当前能够容纳的元素个数:" << v1.capacity() << endl;
    12. cout << "第一个数:" << v1.front() << endl;
    13. cout << "最后一个数:" << v1.back() << endl;
    14. v1.insert(v1.begin()+3,5); //指定位置插入
    15. v1.show();
    16. cout << "3当前能够容纳的元素个数:" << v1.capacity() << endl;
    17. v1.pop_back(); //删除末尾元素
    18. v1.show();
    19. cout << "4当前能够容纳的元素个数:" << v1.capacity() << endl;
    20. v1.assign(13,1); //向容器中赋值
    21. v1.show();
    22. cout << "5当前能够容纳的元素个数:" << v1.capacity() << endl;
    23. return 0;
    24. }

    运行结果 

    思维导图 

  • 相关阅读:
    做食品能入驻Lazada吗?带你解锁东南亚当地热销及需求食品系列
    vue前端中v-model与ref的区别
    未来之路:互联网技术驱动汽车行业的创新浪潮
    cuda PyTorch
    ChatGPT付费创作系统V2.3.4独立版 +WEB端+ H5端 + 小程序最新前端
    3D制图教程
    【C#】使用Windows窗体实现链接跳转功能
    C#中的类型转换-自定义隐式转换和显式转换
    SQL语言
    【PyTorch][chapter 20][李宏毅深度学习]【无监督学习][ GAN]【实战】
  • 原文地址:https://blog.csdn.net/weixin_52238362/article/details/132890930