栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++课程小作业-STL容器与迭代器的实现路径-设计类vector容器myVector

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++课程小作业-STL容器与迭代器的实现路径-设计类vector容器myVector

一、问题提出

STL是高效的C++程序库,是大量类模板和函数模板的聚集,主要的组成部分包括容器、迭代器、算法、函数等。其中容器是存放对象的集合,使用类模板方式; 选代器是容器与算法的粘合剂,是所谓的泛型指针, 使用类模板方式,迭代器提供了访问容器中对象的方法,其实质是容器中对象的指针;而算法则为操作集合数据的通用算法, 也使用函数模板方式。这种巧妙的方法, 让我们在使用容器管理对象时非常方便。
请查阅相在资料,解决如下问题:
1、如何实现一个类似于vector的容器myVector, 该容器能像vector一样可以实例化为存放某种数据数据的数据,并能对数据提供基本的管理, 如插入数据、删除某指定的数据、可以动态扩容、可以删除全部数据等。
2、如何实现一个与之相匹配的迭代器myliterator,该迭代器能像vector的迭代器一样,可以用它来遍历或操作访问myVector中的对象。

二、代码实现
//使用结构体存储迭代器指针
	struct myIterator
	{
		T* p;
		myIterator()
		{
			p = nullptr;
		}
		//重载赋值运算符
		myIterator& operator =(myIterator const& srcIt)
		{
			p = srcIt.p;
			return *this;
		}
		//重载指针运算符
		T operator *()
		{
			return *p;
		}
		//重载后置++
		myIterator& operator ++(int)
		{
			p++;
			return *this;
		}
		//重载+运算符
		myIterator operator +(int n)
		{
			p += n;
			return *this;
		}
		//重载-运算符,返回两指针之间的元素的个数
		int operator -(myIterator const& srcIt)
		{
			return p - srcIt.p;
		}
		//重载不等于运算符
		bool operator !=(myIterator const& srcIt)
		{
			return p != srcIt.p ? true : false;
		}
	};
//在容器后端增加元素
	void myPush_back(const T& d)
	{
		//容量不足时需要扩容
		if (curpos >= length)
		{
			length = length * 2 + 1;
			T* temp = new T[length];
			memcpy(temp, data, sizeof(T) * curpos);
			if (data) {
				delete[] data;
			}
			data = temp;
		}
		data[curpos] = d;
		curpos++;
	}
	//在容器末尾删除元素
	void myPop_back()
	{
		assert(curpos > 0);//assert函数的作用是,如果它的条件返回错误,则终止程序执行
		curpos--;
	}
三、代码测试及结果
#include "myvector.h"

int main()
{
	//创建两个容器
	myVectorv1;
	myVectorv2;
	//添加元素
	v1.myPush_back(1);
	v1.myPush_back(2);
	v2.myPush_back(4);
	v2.myPush_back(5);
	//迭代器遍历容器
	myVector::myIterator it1;
	cout << "v1:" << "t";
	for (it1 = v1.myBegin(); it1 != v1.myEnd(); it1++)
	{
		cout << *it1 << "t";
	}
	cout << endl;
	myVector::myIterator it2;
	cout << "v2:" << "t";
	for (it2 = v2.myBegin(); it2 != v2.myEnd(); it2++)
	{
		cout << *it2 << "t";
	}
	cout << endl;
	//插入元素
	it1 = v1.myEnd() + 1;
	v1.myInsert(it1, 3);
	it2 = v2.myEnd() + 1;
	v2.myInsert(it2, 6);
	//交换元素
	v1.mySwap(v2);
	cout << "交换后:" << endl;
	cout << "v1:" << "t";
	for (it1 = v1.myBegin(); it1 != v1.myEnd(); it1++)
	{
		cout << *it1 << "t";
	}
	cout << endl;
	cout << "v2:" << "t";
	for (it2 = v2.myBegin(); it2 != v2.myEnd(); it2++)
	{
		cout << *it2 << "t";
	}
	cout << endl;
	//其他部分函数测试
	cout << "v1的元素个数:" << v1.size() <<"t" << "v2的末尾元素:" << v2.myBack() << endl;
	//拷贝构造
	myVectorv3(v1);
	cout << "v3:"<<"t";
	myVector::myIterator it3;
	for (it3 = v3.myBegin(); it3 != v3.myEnd(); it3++)
	{
		cout << *it3 << "t";
	}
	cout << endl;
	//删除元素
	it3 = v3.myBegin()+1;
	v3.myErase(it3);
	v3.myPop_back();
	cout << "v3:" << "t";
	for (it3 = v3.myBegin(); it3 != v3.myEnd(); it3++)
	{
		cout << *it3 << "t";
	}
	cout << endl;
	//清空容器
	v3.myClear();
	cout << "v3是否为空:" << v3.isEmpty() << endl;
	return 0;
}

由于代码太多,篇幅有限,需要自取:
C++课程小作业-STL容器与迭代器的实现路径-设计类vector容器myVector

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971383.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号