• C++ --- Day05


    vector 实现。有错误,没复刻 

    1. #include
    2. #include
    3. using namespace std;
    4. template <class T>
    5. class Myvector
    6. {
    7. public:
    8. //无参构造
    9. Myvector()
    10. {
    11. vec_arr = nullptr;
    12. last = nullptr;
    13. end = nullptr;
    14. }
    15. //有参构造
    16. Myvector(int size)
    17. {
    18. vec_arr = new T[size];
    19. end = vec_arr + size;
    20. last = end;
    21. memset(vec_arr,0,sizeof (int)*size);
    22. }
    23. Myvector(int size , T elem)
    24. {
    25. vec_arr = new T[size];
    26. end = vec_arr + size;
    27. last = end;
    28. int i = 0;
    29. while(vec_arr+i != end)
    30. {
    31. *(vec_arr+i) = elem;
    32. i++;
    33. }
    34. }
    35. //拷贝构造
    36. Myvector(const Myvector &mvt)
    37. {
    38. if(vec_arr==mvt.vec_arr){}
    39. else if(mvt.vec_arr == nullptr)
    40. {
    41. vec_arr = nullptr;
    42. end = nullptr;
    43. last = nullptr;
    44. }
    45. else
    46. {
    47. int len = mvt.end - mvt.vec_arr;
    48. vec_arr = new T[len];
    49. for(int i = 0; i < len;i++)
    50. {
    51. *(vec_arr + i) = *(mvt.vec_arr + i);
    52. }
    53. last = vec_arr + (mvt.last-mvt.vec_arr);
    54. end = vec_arr + (mvt.end-mvt.vec_arr);
    55. }
    56. }
    57. //析构
    58. ~Myvector()
    59. {
    60. if(vec_arr != nullptr)
    61. {
    62. delete [] vec_arr;
    63. }
    64. }
    65. //拷贝赋值
    66. Myvector& operator=(const Myvector& mvt);
    67. //改变容器中可存储元素的个数
    68. void resize( int new_size );
    69. //将值赋给容器
    70. void assign(int num , T elem);
    71. //访问指定的元素,同时进行越界检查
    72. T& at(int pos);
    73. //访问指定的元素,[]重载
    74. T& operator[](int pos);
    75. //访问第一个元素 到首元素的引用
    76. T& front() const;
    77. //访问最后一个元素 到尾元素的引用
    78. T& back() const;
    79. //返回指向内存中数组第一个元素的指针
    80. const T* data()const;
    81. //检查容器是否为空
    82. bool empty() const;
    83. //返回元素个数
    84. int size() const;
    85. //返回当前存储空间能够容纳的元素数
    86. int capacity() const;
    87. //预留存储空间
    88. void reserve( int new_cap );
    89. //插入元素
    90. void insert( int pos, const T& elem );
    91. //清除内容
    92. void clear();
    93. //将元素添加到容器末尾
    94. void push_back( const T& elem );
    95. //移除末元素
    96. void pop_back();
    97. public:
    98. T *vec_arr;//首地址
    99. T *last;//有效元素后一位
    100. T *end;//最后一位后一位
    101. };
    102. int main()
    103. {
    104. cout<<"无参构造:"<
    105. cout<<" assign:"<
    106. Myvector<int> v1;
    107. v1.assign(5,1);
    108. for(int i = 0;i<5;i++)
    109. cout<at(i)<<" ";
    110. cout<
    111. cout<<" 用at()更改下标为2的元素为8:"<
    112. v1.at(2) = 8;
    113. for(int i = 0;i<5;i++)
    114. cout<at(i)<<" ";
    115. cout<
    116. cout<<" 用[]更改下标为3的元素为9:"<
    117. v1[3] = 9;
    118. for(int i = 0;i<5;i++)
    119. cout<at(i)<<" ";
    120. cout<
    121. cout<<"-------------------"<
    122. cout<<"有参构造:"<
    123. Myvector<int> v2(5,4);
    124. for(int i = 0;i<5;i++)
    125. v2.at(i) = i ;
    126. for(int i = 0;i<5;i++)
    127. cout<at(i)<<" ";
    128. cout<
    129. //访问第一个元素 到首元素的引用
    130. cout<front()<
    131. //访问最后一个元素 到尾元素的引用
    132. cout<back()<
    133. //返回指向内存中数组第一个元素的指针
    134. cout<data()<
    135. //返回元素个数
    136. cout<size()<
    137. //返回当前存储空间能够容纳的元素数
    138. cout<capacity()<
    139. cout<<"-------------------"<
    140. cout<<"拷贝构造:"<
    141. Myvector<int> v3(v2);
    142. //清除内容
    143. v3.clear();
    144. //预留存储空间
    145. v3.reserve(50);
    146. cout<<"v3.capacity:"<capacity()<
    147. //插入元素
    148. v3.insert(0,1);
    149. cout<<"v3的元素个数:"<size()<
    150. cout<<"v3首元素:"<front()<
    151. //将元素添加到容器末尾
    152. v3.push_back(10);
    153. for(int i = 0;isize();i++)
    154. cout<at(i)<<" ";
    155. cout<
    156. cout<size()<
    157. //移除末元素
    158. v3.pop_back();
    159. for(int i = 0;isize();i++)
    160. cout<at(i)<<" ";
    161. cout<
    162. return 0;
    163. }
    164. //拷贝赋值
    165. template<class T>
    166. Myvector& Myvector::operator=(const Myvector& mvt)
    167. {
    168. if(this->vec_arr == mvt.vec_arr){}
    169. else
    170. {
    171. int len = mvt.end - mvt.vec_arr;
    172. if(vec_arr != nullptr)
    173. delete []vec_arr;
    174. vec_arr = new T[len];
    175. for(int i = 0; i < len;i++)
    176. {
    177. *(vec_arr + i) = *(mvt.vec_arr + i);
    178. }
    179. last = vec_arr + (mvt.last-mvt.vec_arr);
    180. end = vec_arr + (mvt.end-mvt.vec_arr);
    181. }
    182. return *this;
    183. }
    184. //改变容器中可存储元素的个数
    185. template<class T>
    186. void Myvector::resize( int new_size )
    187. {
    188. int len = last-vec_arr;
    189. if(vec_arr != nullptr)
    190. {
    191. T* p = vec_arr;
    192. if(len < new_size)
    193. {
    194. this->vec_arr = new T[new_size];
    195. last = vec_arr;
    196. }
    197. for(int i=0;i-1;i++)
    198. {
    199. *(vec_arr + i) = *(p + i);
    200. }
    201. delete [] p;
    202. end = vec_arr + new_size;
    203. last = end;
    204. }
    205. else
    206. {
    207. this->vec_arr = new T[new_size];
    208. last = vec_arr;
    209. end = vec_arr + new_size;
    210. }
    211. }
    212. //将值赋给容器
    213. template<class T>
    214. void Myvector::assign(int num , T elem)
    215. {
    216. int len = end-vec_arr;
    217. if(len == 0)
    218. {
    219. vec_arr = new T[num];
    220. last = vec_arr;
    221. end = vec_arr + num;
    222. while(last != end)
    223. *(last++) = elem;
    224. }
    225. else
    226. {
    227. while(num > len)
    228. {
    229. len = len * 2;
    230. }
    231. this->resize(len);
    232. for(int i = 0;i
    233. *(vec_arr+i) = elem;
    234. end = vec_arr + len;
    235. last = vec_arr + num;
    236. }
    237. }
    238. //访问指定的元素,同时进行越界检查
    239. template<class T>
    240. T& Myvector::at(int pos)
    241. {
    242. int len = last - vec_arr;
    243. if(pos < 0 || pos >= len)
    244. {
    245. throw int(-1);
    246. }
    247. return *(vec_arr + pos);
    248. }
    249. //访问指定的元素,[]重载
    250. template<class T>
    251. T& Myvector::operator[](int pos)
    252. {
    253. int len = last - vec_arr;
    254. if(pos < 0 || pos >= len)
    255. {
    256. throw int(-1);
    257. }
    258. return *(vec_arr + pos);
    259. }
    260. //访问第一个元素 到首元素的引用
    261. template<class T>
    262. T& Myvector::front() const
    263. {
    264. int len = last - vec_arr;
    265. if(len == 0)
    266. {
    267. throw int(-1);
    268. }
    269. return *(vec_arr);
    270. }
    271. //访问最后一个元素 到尾元素的引用
    272. template<class T>
    273. T& Myvector::back() const
    274. {
    275. return *(last-1);
    276. }
    277. //返回指向内存中数组第一个元素的指针
    278. template<class T>
    279. const T* Myvector::data()const
    280. {
    281. return vec_arr;
    282. }
    283. //检查容器是否为空
    284. template<class T>
    285. bool Myvector::empty() const
    286. {
    287. if(last == vec_arr)
    288. return true;
    289. return false;
    290. }
    291. //返回容纳的元素数
    292. template<class T>
    293. int Myvector::size() const
    294. {
    295. return last - vec_arr;
    296. }
    297. //返回当前存储空间能够容纳的元素数
    298. template<class T>
    299. int Myvector::capacity() const
    300. {
    301. return end - vec_arr;
    302. }
    303. //预留存储空间
    304. template<class T>
    305. void Myvector::reserve( int new_cap )
    306. {
    307. if(new_cap >=0)
    308. {
    309. vec_arr = new T[new_cap];
    310. last = vec_arr;
    311. end = vec_arr + new_cap;
    312. }
    313. }
    314. //插入元素
    315. template<class T>
    316. void Myvector::insert( int pos, const T& elem )
    317. {
    318. int len = last - vec_arr;
    319. if(pos < 0 || pos >len)
    320. {
    321. throw int(-1);
    322. }
    323. if(last == end)
    324. {
    325. this->resize(len*2);
    326. T* p = end;
    327. for(int i = 0 ; i < len-pos;i++)
    328. {
    329. *p = *(p-1);
    330. p--;
    331. }
    332. *p = elem;
    333. last++;
    334. }
    335. else if(len==0)
    336. {
    337. this->resize(1);
    338. *vec_arr = elem;
    339. }
    340. }
    341. //清除内容
    342. template<class T>
    343. void Myvector::clear()
    344. {
    345. last = vec_arr;
    346. }
    347. //将元素添加到容器末尾
    348. template<class T>
    349. void Myvector::push_back( const T& elem )
    350. {
    351. int len = last - vec_arr;
    352. if(last == end)
    353. this->resize(len*2);
    354. *last = elem;
    355. last++;
    356. }
    357. //移除末元素
    358. template<class T>
    359. void Myvector::pop_back()
    360. {
    361. if(this->empty())
    362. throw int(-2);
    363. last--;
    364. }

  • 相关阅读:
    Spring原理学习(七)JDK动态代理与CGLIB代理底层实现
    【正点原子FPGA连载】第二十五章 双路高速AD实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
    常用的鼠标事件和键盘事件
    缺陷之灵魂操作bug
    spring整合fastdfs客户端
    善网ESG周报(第一期)
    优思学院|八大浪费深度剖析
    Linux 系统移植(一)-- 系统组成
    Nacos适配达梦
    【研0自学100天 —— Day 8 函数定义和声明 】
  • 原文地址:https://blog.csdn.net/weixin_61882921/article/details/132891144