题目要求
费手实验{tabs}
Warning
自定义Vector类, 实现以下操作:
(1)基于动态存储分配自定义一个整数向量类Vector,实现构造函数(至少两个,包括一个无参),拷贝构造函数和析构函数;并实现一些常见功能,比如:insert, erase, push_back, pop_back, clear, size等等。要求存储空间可自动增长,动态增长策略合理(比如,每次容量不够时原容量加倍)。
(2)在主程序中,对定义的Vector进行充分测试(以下仅供参考,主函数可以自己设计):
定义一个Vector对象a, push_back若干数据 到a中(一边push_back,一边打印size和capacity的值观察其变化);输出所有数据;输出第一个元素,输出最后一个元素,删除数组首尾的两个数据,删除一个特定位置的数据,并输出当前a所有数据;输入一个数据,添加到末尾,输入一个数据,插入到数组头部;输入一个数据,插入到中间某位置;输出目前向量a中的所有数据。
定义一个Vecotor对象b, 初始化为包含5个值为7的元素,输出b所有数据,输出有效元素个数及容量;在b后面添加6个数据,输出有效元素个数及容量,观察其变化;由对象b拷贝构造出对象c,修改b的某个数据的值,修改c的某个数据的值,输出b,c所有元素的值, 观察是否符合操作语义。
源码
#include <iostream>
using namespace std;
class Vector{
int cap; //最大容量
int sz; //已有个数
int* buf; //指针
public:
Vector(){
sz = 0; cap = 4;buf = new int[4];
}
Vector(int n,int num);
Vector(const Vector &a);
~Vector(){
delete[] buf;
}
int& operator[] (int i){
if (i > sz) exit(1);
return buf[i];
}
//其他成员函数实现一些常见功能,比如:insert, erase, push_back, pop_back, clear, size等等。要求存储空间可自动增长,动态增长策略合理(比如,每次容量不够时原容量加倍)。
void push_back(int x);
void pop_back();
void insert(int i ,int val);
void erase(int i);
void clear();
int size();
void print(){
printf("size: %d, capacity: %d \n",sz,cap);
}
void printall(){
cout << "{";
for(int i = 0;i<sz;i++){
if(i!=sz-1) cout << buf[i] << ",";
else {
cout << buf[i];
cout << "}";
}
}
cout<<endl;
}
};
Vector::Vector(int n,int num){
for(int i = 1;i<=n;i++){
if(sz >= cap){
if(cap == 0) cap =2;
int *buf2 = new int[cap*=2]; //扩容
memcpy(buf2,buf,sz*sizeof(int));
buf2[sz] = num;
delete[] buf;
buf = buf2;
}
else{
buf[sz] = num;
}
sz++;
}
}
Vector::Vector(const Vector &a){
cap = sz = a.sz;
buf = new int[sz];
memcpy(buf,a.buf,sz*sizeof(int));
}
void Vector::insert (int i ,int val){
if(i > sz || i<0) return;
if(sz >= cap){
cap *=2;
int *buf2 = new int[cap]; //扩容
memcpy(buf2,buf,i*sizeof(int));
buf2[i] = val;
memcpy(buf2+i+1,buf+i,(sz-i)*sizeof(int));
delete[] buf;
buf = buf2;
}
else{
int *buf2 = new int[cap];
memcpy(buf2,buf,i*sizeof(int));
buf2[i] = val;
memcpy(buf2+i+1,buf+i,(sz-i)*sizeof(int));
delete[] buf;
buf = buf2;
}
sz++;
}
void Vector::push_back(int x){
if(sz >= cap){
if(cap == 0) cap =2;
int *buf2 = new int[cap*=2]; //扩容
memcpy(buf2,buf,sz*sizeof(int));
buf2[sz] = x;
delete[] buf;
buf = buf2;
}
else{
buf[sz] = x;
}
sz++;
}
void Vector::pop_back(){
sz--;
if(sz < cap / 4 && cap >= 4*2){
cap /= 2;
int *buf2 = new int[cap];
for(int i = 0 ;i < sz;i++){
buf2[i] = buf[i];
}
delete[] buf;
buf = buf2;
}
else{
int *buf2 = new int[cap];
for(int i = 0 ;i < sz;i++){
buf2[i] = buf[i];
}
delete[] buf;
buf = buf2;
}
}
void Vector::erase(int i){
if(i > sz || i<0) return;
for(int j = i;j < sz-1;j++){
buf[j] = buf[j+1];
}
sz--;
if(sz < cap / 4 && cap >= 4*2){
cap /= 2;
int *buf2 = new int[cap];
memcpy(buf2,buf,i*sizeof(int));
delete[] buf;
buf = buf2;
}
}
void Vector::clear(){
sz = 0;
if(cap >= 4*2){
cap =4;
}
int* buf2 = new int[cap];
delete[] buf;
buf = buf2;
}
int Vector::size(){
return sz;
}
int main(){
int x = 0;
Vector a;
printf("%s\n","Push number 1");
a.push_back(1);
a.print();
printf("%s\n","Push number 2");
a.push_back(2);
a.print();
printf("%s\n","Push number 3");
a.push_back(3);
a.print();
printf("%s\n","Push number 5");
a.push_back(5);
a.print();
printf("%s\n","Push number 7");
a.push_back(7);
a.print();
a.printall();
cin >> x;
a.push_back(x);
a.printall();
cin >>x;
a.insert(0,x);
a.printall();
cin >> x;
a.insert(4,x);
a.printall();
printf("%s\n","a -> pop_back:");
a.pop_back();
a.printall();
a.clear();
printf("%s\n","a -> clear:");
a.print();
cout << endl <<endl;
printf("%s\n","Test 2:");
Vector b(7,7);
b.print();
for(int i = 1;i<=7;i++){
b.push_back(i);
b.print();
}
cout << "size:" << b.size() <<endl;
Vector c(b);
c.insert(5,100);
b.insert(5,100);
b.printall();
c.printall();
}
版权属于:LanStarD
本文链接:https://blog.chordvers.com/index.php/archives/8/
本站未注明转载的文章均为原创,并采用
CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!