设计一个容器类MyVector来管理和动态存储n个整型数,并能支持完成以下代码调用的相应功能:
MyVector va; //定义一个空容器
MyVector vb(10);//定义了10个整数的容器,没有初值
MyVector vc(12,1);//定义了12个整数的容器,初值为1
MyVector vd(vc);//以已知容器创建新容器
va.pushback(5);//末尾增加一个值为5的元素va.display();//输出容器的各元素值
(加)通过取分量运算符直接访问/修改容器内的元素。
起初思考利用new直接申请动态空间int,后来在实现pushback()的功能的时候发现难以将新申请的动态内存空间与之前的练习起来,所以改用了链表实现。
//MyVector.h
#pragma once
class Node //定义节点
{
public:
int a;
int order;
Node* next=nullptr;
Node();
Node(int value);
};
class MyVector //定义容器
{
public:
MyVector(int number=0);
MyVector(int number,int defvalue);
MyVector(const MyVector& copy);
void pushback(int defvalue);
void display();
int& operator[](int index);
int size();
~MyVector();
private:
Node* pNext=nullptr;
Node* pFirst=nullptr;
int length=0;
};
函数成员实现如下:
//MyVector.cpp
#include<iostream>
#include "MyVector.h"
using namespace std;
/*Node 类的构造函数,传参情况*/
Node::Node(int value)
{
a = value;
order = 0;
}
/*未初始化的构造函数,不传参情况*/
Node::Node(){}
/*无初值情况,定义一个无初值容器*/
MyVector::MyVector(int number){
for (int i = 0; i < number; i++) {
if (i == 0) {
pFirst = pNext = new Node;
pNext->order = i;
}
else{
pNext->next = new Node;
pNext = pNext->next;
pNext->order = i;
}
}
length = number;
}
/*有初值情况*/
MyVector::MyVector(int number, int defvalue)
{
for (int i = 0; i < number; i++) {
if (i == 0) {
pFirst = pNext = new Node(defvalue);
pNext->order = i;
} //记录首指针
else {
pNext->next = new Node(defvalue);
pNext = pNext->next;
pNext->order = i;
}
}
length = number;
}
/*拷贝构造的情况*/
MyVector::MyVector(const MyVector& copy)
{
Node* ptr = copy.pFirst;
length = copy.length;
for (int i = 0; i < length; i++) {
if (i == 0) {
pFirst = pNext = new Node(ptr->a); //记录首指针
pNext->order = i;
}
else {
pNext->next = new Node(ptr->a);
pNext = pNext->next;
pNext->order = i;
}
ptr = ptr->next;
}
}
/*末尾增加一个值为 value 的元素*/
void MyVector::pushback(int value)
{
pNext->next = new Node(value);
pNext = pNext->next;
pNext->order = length;
length++;
}
/*打印整个的值*/
void MyVector::display()
{
Node* ptr = pFirst;
while (ptr) {
cout << ptr->a << " ";
ptr = ptr->next;
}
cout << endl;
}
/*取分量操作符的重载*/
int& MyVector::operator[] (int index)
{
if (index<0 || index>=length)
cout << "超出范围" << endl;
else {
Node* ptr = pFirst;
for (int i = 0; i < length; i++) {
if (index == (ptr->order))
return ptr->a;
ptr = ptr->next;
}
}
}
/*返回容器长度*/
int MyVector::size()
{
return length;
}
/*析构,删除申请的空间*/
MyVector::~MyVector()
{
Node* ptr = pFirst;
while (ptr)
{
ptr = ptr->next;
delete pFirst;
pFirst = ptr;
}
cout << "Over!" << endl;
}
测试部分如下:
#include <iostream>
#include"MyVector.h"
using namespace std;
int main()
{
MyVector vc(12, 1);
vc.display();
MyVector vd(10);
vd.display();
MyVector ve(vc);
ve.display();
ve.pushback(89);
ve.pushback(99);
ve.display();
cout << "改变第6个的值为95" << endl;
ve[5] = 95;
cout << "第6个元素为:" << ve[5] << endl;
for (int i = 0; i < ve.size(); i++) {
cout << "第"<<i+1<<"个元素为:" << ve[i] << endl;
MyVector vf;
vf.display();
return 0;
}
运行测试结果如下: