• Cpp/Qtday070914cpp基础


    目录

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

    代码

    效果

    思维导图


    仿照vector手动实现自己的myVector,最主要实现二倍扩容功能
    代码
    1. #include
    2. using namespace std;
    3. template <typename T>
    4. class Vector
    5. {
    6. private:
    7. T* ptr;
    8. int len;
    9. int size;
    10. public:
    11. Vector():ptr(new T[1]),len(0),size(1){cout<<"无参构造"<
    12. Vector(int s):ptr(new T[s]),len(0),size(s){cout<<"有参构造"<
    13. Vector(int s,T u):ptr(new T[s]),len(s),size(s){
    14. for(int i=0; i
    15. ptr[i] = u;
    16. }
    17. cout<<"有参构造"<
    18. }
    19. Vector(const Vector &v):ptr(new T[v.size]),len(v.len),size(v.size){
    20. for(int i=0; i
    21. ptr[i] = v.ptr[i];
    22. }
    23. cout<<"拷贝构造"<
    24. }
    25. ~Vector(){
    26. delete [] ptr;
    27. cout<<"析构函数"<
    28. }
    29. bool operator==(const Vector &other){
    30. //先要满足大小和长度相等
    31. if(other.size==size&&other.len==len){
    32. //然后满足表中对应下标的元素相等
    33. for(int i=0; i
    34. //一旦出现不相等,就不满足条件了,退出返回假
    35. if(*(ptr+i)!=*(other.ptr+i)){
    36. return false;
    37. }
    38. }
    39. //循环结束还没退出函数,说明没问题
    40. return true;
    41. }else{
    42. //第一个条件都没满足,自然返回假
    43. return false;
    44. }
    45. }
    46. bool empty(){
    47. return len == 0;
    48. }
    49. bool full(){
    50. return len == size;
    51. }
    52. T &operator[](int pos){
    53. //另写一个函数,在这里调用另一个函数,就可以打印出错误信息
    54. try {
    55. return unit_get_pos(pos);
    56. } catch (double) {
    57. cout<<"the positon is wrong"<
    58. }
    59. }
    60. T& unit_get_pos(int pos){
    61. //pos的大小应该在0到len-1,
    62. if(pos<0||pos>=len){
    63. throw double(1);
    64. }
    65. return *(ptr+pos);
    66. }
    67. T &at(int pos){
    68. //和中括号运算符同理,在这里调用另一个函数,就可以打印出错误信息
    69. try {
    70. return unit_get_pos(pos);
    71. } catch (double) {
    72. cout<<"the positon is wrong"<
    73. }
    74. }
    75. void space_extern(){
    76. //将自己原本的数据拷贝一份
    77. Vector tmp(*this);
    78. //释放原本指向的堆区空间
    79. delete [] ptr;
    80. //自己的容量变为原来的两倍
    81. size = 2*size;
    82. //重新在堆区申请原来两倍大的空间
    83. ptr = new T[size];
    84. //将自己的数据按顺序装入自己新申请的空间内
    85. for(int i=0; i
    86. *(ptr + i) = *(tmp.ptr + i);
    87. }
    88. //函数结束后tmp会自动析构,析构函数中已经写入空间的释放,所以不用对tmp有额外的操作
    89. }
    90. void push_back(T unit){
    91. if(full()){
    92. //先判满,如果满了,自动扩容
    93. space_extern();
    94. }
    95. //有足够空间后,正常入表
    96. *(ptr + len++) = unit;
    97. }
    98. T& pop_back(){
    99. if(empty()){
    100. //先判空,如果为空,无法输出
    101. cout<<"顺序表为空,无法pop"<
    102. throw int(0);
    103. }
    104. //非空,正常出表
    105. return *(ptr + --len);
    106. }
    107. T& front(){
    108. if(empty()){
    109. //先判空,如果为空,无法输出
    110. cout<<"顺序表为空,无法pop"<
    111. throw int(0);
    112. }
    113. //非空,正常输出
    114. return *ptr;
    115. }
    116. void clear(){
    117. len = 0;
    118. }
    119. int end(){
    120. return len;
    121. }
    122. };
    123. int main()
    124. {
    125. //无参构造
    126. Vector<int> V1;
    127. V1.push_back(4);
    128. cout<<"4入表成功"<
    129. V1.push_back(3);
    130. cout<<"3入表成功"<
    131. V1.push_back(9);
    132. cout<<"9入表成功"<
    133. V1.push_back(6);
    134. cout<<"6入表成功"<
    135. cout<<"下标为0的元素值为:"<0]<
    136. cout<<"下标为2的元素值为:"<at(2)<
    137. cout<<"展示V1:";
    138. for(int i=0; iend(); i++){
    139. cout<" ";
    140. }
    141. cout<
    142. V1[0] = 5;
    143. V1.at(2) = 7;
    144. cout<<"部分值修改后展示V1:";
    145. for(int i=0; iend(); i++){
    146. cout<" ";
    147. }
    148. cout<
    149. //拷贝构造
    150. Vector<int> V2(V1);
    151. if(V1==V2){
    152. cout<<"此时V1和V2相等"<
    153. }else{
    154. cout<<"此时V1和V2不相等"<
    155. }
    156. cout<<"展示V2:";
    157. for(int i=0; iend(); i++){
    158. cout<" ";
    159. }
    160. cout<
    161. //出表
    162. V1.pop_back();
    163. cout<<"展示V1:";
    164. for(int i=0; iend(); i++){
    165. cout<" ";
    166. }
    167. cout<
    168. if(V1==V2){
    169. cout<<"此时V1和V2相等"<
    170. }else{
    171. cout<<"此时V1和V2不相等"<
    172. }
    173. return 0;
    174. }
    效果

    思维导图

  • 相关阅读:
    【算法100天 | 2】位运算实现加减乘除(含:LeetCode 29题 两数相除)
    HyperLynx(三十二)高速串行总线仿真(四)
    Python第三方库之MedPy
    基于SSM的教评系统毕业设计-附源码281157
    LeetCode - 解题笔记 -201- Bitwise AND of Numbers Range
    ke10javaweb停更
    入门力扣自学笔记99 C++ (题目编号814)
    java连接mysql8.0.28数据库实例
    【日志技术——Logback日志框架】
    二进制部署k8集群(上)搭建单机matser和etcd集群
  • 原文地址:https://blog.csdn.net/sy311SB/article/details/132890366