• C++day7


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

    1. #include
    2. using namespace std;
    3. template<typename T>
    4. class my_vector
    5. {
    6. int size;//可存储的容量大小
    7. int num;//当前存储的元素个数
    8. T* data;//存储数据的空间地址
    9. public:
    10. //无参构造函数
    11. my_vector();
    12. //有参构造函数
    13. my_vector(int n, const T m);
    14. //析构函数
    15. ~my_vector();
    16. //拷贝构造
    17. my_vector(const my_vector &other);
    18. //返回当前的容器大小
    19. int get_capacity();
    20. //获取容器中的元素个数
    21. int get_size();
    22. //判空函数
    23. bool empty();
    24. //添加函数
    25. void push_back(const T &val);
    26. //向容器中赋值
    27. void assign(int n,const T &val);
    28. //访问容器中的元素
    29. T& at(int loc);
    30. //清空容器中的元素
    31. void clear();
    32. //删除最后一个元素
    33. void pop_back();
    34. //返回起始位置的引用
    35. T& front();
    36. //返回最后一个位置的引用
    37. T& back();
    38. //返回第一个位置的迭代器
    39. T* begin();
    40. //返回末尾下一个位置的迭代器
    41. T* end();
    42. //任意插入
    43. T* insert(T* p, const T& n);
    44. //遍历
    45. void show();
    46. };
    47. int main()
    48. {
    49. my_vector<int> s1;
    50. s1.assign(7,1);
    51. cout<<"最大容量"<get_capacity()<
    52. cout<<"最后一个元素 "<at(6)<
    53. s1.insert(s1.end(),4);
    54. cout<<"最后一个元素 "<back()<
    55. cout<<"共有元素"<get_size()<
    56. cout<<"最后一个元素 "<at(8)<
    57. s1.show();
    58. cout<<"最大容量"<get_capacity()<
    59. s1.pop_back();
    60. s1.show();
    61. return 0;
    62. }
    63. //无参构造
    64. template<typename T>
    65. my_vector::my_vector()
    66. {
    67. size=6;
    68. num=0;
    69. data = new T[6];
    70. }
    71. //有参构造
    72. template<typename T>
    73. my_vector::my_vector(int n, const T m)
    74. {
    75. size = n;
    76. num = n;
    77. data = new T[n];
    78. for(int i=0;i
    79. {
    80. data[i]= m;
    81. }
    82. }
    83. template<typename T>
    84. my_vector::~my_vector()
    85. {
    86. delete []data;
    87. }
    88. //拷贝构造
    89. template<typename T>
    90. my_vector::my_vector(const my_vector &other)
    91. {
    92. size = other.size;
    93. num = other.num;
    94. data = new T[size];
    95. for(int i=0;i
    96. {
    97. data[i] = other.data[i];
    98. }
    99. }
    100. //当前容器的大小
    101. template<typename T>
    102. int my_vector::get_capacity()
    103. {
    104. return size;
    105. }
    106. template<typename T>
    107. int my_vector::get_size()
    108. {
    109. return num;
    110. }
    111. //判空函数
    112. template<typename T>
    113. bool my_vector::empty()
    114. {
    115. if(0 == num)
    116. {
    117. return true;
    118. }
    119. else
    120. return false;
    121. }
    122. //添加函数
    123. template<typename T>
    124. void my_vector::push_back(const T &val)
    125. {
    126. if(num
    127. {
    128. data[num] = val;
    129. num++;
    130. }
    131. else
    132. {
    133. T *temp = new T[2*size];
    134. size = 2*size;
    135. for(int i=0;i
    136. {
    137. temp[i] = data[i];
    138. }
    139. delete []data;//释放旧的空间
    140. data = temp;//指向新的空间
    141. temp = nullptr;
    142. data[num] = val;
    143. num++;
    144. }
    145. }
    146. //向容器中赋值
    147. template<typename T>
    148. void my_vector::assign(int n, const T &val)
    149. {
    150. //判断赋值的个数是否超过最大容量
    151. if(n>size)
    152. {
    153. delete [] data;
    154. data = nullptr;
    155. data = new T [n];
    156. size = n;
    157. num = n;
    158. //赋值
    159. for(int i=0;i
    160. {
    161. data[i] = val;
    162. }
    163. }
    164. else
    165. {
    166. num=n;
    167. for(int i=0;i
    168. {
    169. data[i] = val;
    170. }
    171. }
    172. }
    173. //访问元素
    174. template<typename T>
    175. T& my_vector::at(int loc)
    176. {
    177. if(loc > num || loc < 0)
    178. {
    179. throw T(1);//越界异常
    180. }
    181. else
    182. {
    183. return data[loc-1];
    184. }
    185. }
    186. //清空所有元素
    187. template<typename T>
    188. void my_vector::clear()
    189. {
    190. while (!empty())
    191. {
    192. pop_back();
    193. }
    194. }
    195. //删除末尾元素
    196. template<typename T>
    197. void my_vector::pop_back()
    198. {
    199. if(!empty())
    200. {
    201. data[num-1] = 0;
    202. num--;
    203. }
    204. else
    205. return ;
    206. }
    207. //返回第一个位置的引用
    208. template<typename T>
    209. T &my_vector::front()
    210. {
    211. return data[0];
    212. }
    213. //返回最后一个位置的引用
    214. template<typename T>
    215. T &my_vector::back()
    216. {
    217. return data[num-1];
    218. }
    219. //返回第一个位置的迭代器
    220. template<typename T>
    221. T *my_vector::begin()
    222. {
    223. return &data[0];
    224. }
    225. //返回末尾下一个位置的迭代器
    226. template<typename T>
    227. T *my_vector::end()
    228. {
    229. return &data[num];
    230. }
    231. //任意插入
    232. template<typename T>
    233. T *my_vector::insert(T *p, const T &n)
    234. {
    235. int j = 0;
    236. while(&data[0]+j != p) //寻找输入的是第几个数据的地址
    237. {
    238. j++;
    239. }
    240. if(num == size) //判断当前是否已满
    241. {
    242. int i = 0;
    243. T* data_new = new T[size*2]; //二倍扩容
    244. size = size * 2;
    245. while(i < num) //将旧区的数据内容赋给新区
    246. {
    247. data_new[i] = data[i];
    248. i++;
    249. }
    250. delete []data; //释放旧区
    251. data = data_new; //指向新区
    252. data_new = nullptr; //新指针置空
    253. //将指定位置之后的数据全都后移一位
    254. for(int k = num,i = j;i < num;i++,k--)
    255. {
    256. data[k] = data[k-1];
    257. }
    258. data[j] = n; //插入元素
    259. num++; //存储数量加1
    260. return &data[j];
    261. }
    262. else if(num < size)
    263. {
    264. //将指定位置之后的数据全都后移一位
    265. for(int k = num,i = j;i < num;i++,k--)
    266. {
    267. data[k] = data[k-1];
    268. }
    269. data[j] = n; //插入元素
    270. num++; //存储数量加1
    271. return &data[j];
    272. }
    273. }
    274. //遍历
    275. template<typename T>
    276. void my_vector::show()
    277. {
    278. int i = 0;
    279. for(;i < num;i++)
    280. {
    281. cout << data[i] << "\t";
    282. }
    283. cout << endl;
    284. }

     

  • 相关阅读:
    DTW学习(dynamic time warping)——思想、代码实现
    RabbitMQ之TTL机制
    [附源码]Python计算机毕业设计Django社区生活废品回收APP
    js焦点处理的几种方式
    Linux 简介 & 启动过程
    LeetCode-278(Python)—— 第一个错误的版本
    循环神经网络
    电商rpa是什么意思?跟电商rpi是一个意思吗?
    AI游戏外挂为何违法?
    【D3.js】1.20-给 D3 元素添加工具提示
  • 原文地址:https://blog.csdn.net/qq_53478460/article/details/132890983