目录
仿照vector手动实现自己的myVector,最主要实现二倍扩容功能
- #include
-
- using namespace std;
-
- template <typename T>
- class Vector
- {
- private:
- T* ptr;
- int len;
- int size;
- public:
- Vector():ptr(new T[1]),len(0),size(1){cout<<"无参构造"<
- Vector(int s):ptr(new T[s]),len(0),size(s){cout<<"有参构造"<
- Vector(int s,T u):ptr(new T[s]),len(s),size(s){
- for(int i=0; i
- ptr[i] = u;
- }
- cout<<"有参构造"<
- }
- Vector(const Vector &v):ptr(new T[v.size]),len(v.len),size(v.size){
- for(int i=0; i
- ptr[i] = v.ptr[i];
- }
- cout<<"拷贝构造"<
- }
- ~Vector(){
- delete [] ptr;
- cout<<"析构函数"<
- }
-
- bool operator==(const Vector &other){
- //先要满足大小和长度相等
- if(other.size==size&&other.len==len){
- //然后满足表中对应下标的元素相等
- for(int i=0; i
- //一旦出现不相等,就不满足条件了,退出返回假
- if(*(ptr+i)!=*(other.ptr+i)){
- return false;
- }
- }
- //循环结束还没退出函数,说明没问题
- return true;
- }else{
- //第一个条件都没满足,自然返回假
- return false;
- }
- }
-
- bool empty(){
- return len == 0;
- }
-
- bool full(){
- return len == size;
- }
-
- T &operator[](int pos){
- //另写一个函数,在这里调用另一个函数,就可以打印出错误信息
- try {
- return unit_get_pos(pos);
- } catch (double) {
- cout<<"the positon is wrong"<
- }
- }
-
- T& unit_get_pos(int pos){
- //pos的大小应该在0到len-1,
- if(pos<0||pos>=len){
- throw double(1);
- }
- return *(ptr+pos);
- }
-
- T &at(int pos){
- //和中括号运算符同理,在这里调用另一个函数,就可以打印出错误信息
- try {
- return unit_get_pos(pos);
- } catch (double) {
- cout<<"the positon is wrong"<
- }
- }
-
- void space_extern(){
- //将自己原本的数据拷贝一份
- Vector tmp(*this);
- //释放原本指向的堆区空间
- delete [] ptr;
- //自己的容量变为原来的两倍
- size = 2*size;
- //重新在堆区申请原来两倍大的空间
- ptr = new T[size];
- //将自己的数据按顺序装入自己新申请的空间内
- for(int i=0; i
- *(ptr + i) = *(tmp.ptr + i);
- }
- //函数结束后tmp会自动析构,析构函数中已经写入空间的释放,所以不用对tmp有额外的操作
- }
- void push_back(T unit){
- if(full()){
- //先判满,如果满了,自动扩容
- space_extern();
- }
- //有足够空间后,正常入表
- *(ptr + len++) = unit;
- }
-
- T& pop_back(){
- if(empty()){
- //先判空,如果为空,无法输出
- cout<<"顺序表为空,无法pop"<
- throw int(0);
- }
- //非空,正常出表
- return *(ptr + --len);
- }
-
- T& front(){
- if(empty()){
- //先判空,如果为空,无法输出
- cout<<"顺序表为空,无法pop"<
- throw int(0);
- }
- //非空,正常输出
- return *ptr;
- }
-
- void clear(){
- len = 0;
- }
-
- int end(){
- return len;
- }
- };
-
- int main()
- {
- //无参构造
- Vector<int> V1;
- V1.push_back(4);
- cout<<"4入表成功"<
- V1.push_back(3);
- cout<<"3入表成功"<
- V1.push_back(9);
- cout<<"9入表成功"<
- V1.push_back(6);
- cout<<"6入表成功"<
-
- cout<<"下标为0的元素值为:"<
0]< - cout<<"下标为2的元素值为:"<
at(2)< -
- cout<<"展示V1:";
- for(int i=0; i
end(); i++){ - cout<
" "; - }
- cout<
-
- V1[0] = 5;
- V1.at(2) = 7;
-
- cout<<"部分值修改后展示V1:";
- for(int i=0; i
end(); i++){ - cout<
" "; - }
- cout<
-
- //拷贝构造
- Vector<int> V2(V1);
- if(V1==V2){
- cout<<"此时V1和V2相等"<
- }else{
- cout<<"此时V1和V2不相等"<
- }
-
- cout<<"展示V2:";
- for(int i=0; i
end(); i++){ - cout<
" "; - }
- cout<
-
- //出表
- V1.pop_back();
- cout<<"展示V1:";
- for(int i=0; i
end(); i++){ - cout<
" "; - }
- cout<
-
- if(V1==V2){
-
-
相关阅读:
【算法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