动态数组的模拟实现以及部分算法的实现和迭代器的封装支持范围for

本文档介绍了一个用C++实现的模板类Seqlist,该类支持动态扩容,提供了包括头插、尾插、按位置插入、删除、查找等基本操作,以及冒泡排序和按位置修改数据的功能。Seqlist类使用了指针来管理内存,并通过模板参数T实现了泛型编程,适用于不同类型的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#include<iostream>
#include<memory>
using namespace std;
namespace my {

	template<class T>
	class Seqlist {
	    public:
			typedef T* iterator;//数组支持指针访问,因此直接对原型指针进行封装
		public:
			//构造函数,提供默认容量,用户也可以自行提供
		Seqlist(const size_t& capacity=10)
			:_array(new T[sizeof(T) * capacity])
			,_capacity(capacity)
			, _size(0)
		{}

		//重载[]运算符
		T& operator[](const size_t& pos){
			return _array[pos];
		}

		//尾插
		void push_back(const T& data) {
			if (Is_full()) {//判断数组中是否已满,如果满了则进行扩容操作
				change_capacity();
			}
			_array[_size] = data;
			_size++;
		}
		//获取数组存储元素个数
		size_t Getsize() {
			return _size;
		}
		//获取数组容量
		size_t Getcapacity() {
			return _capacity;
		}
		//头插
		void push_front(const T& data) {
			if (Is_full()) {
				change_capacity();
			}
			for (int i = Getsize(); i > 0; i--) {
				_array[i] = _array[i - 1];
			}
			_array[0] = data;
			_size++;
		}
		//按位置插入
		void push_pos(const size_t& pos,const T& data) {
			if (Is_full()) {
				change_capacity();
			}
			for (int i = Getsize(); i >= pos; i--) {
				_array[i] = _array[i - 1];
			}
			_array[pos - 1] = data;
			_size++;

		}
		//尾删,不需要删除数组元素,只需要访问不到此数据即可
		void pop_back() {
			_size--;
		}
		//头删,依次向前覆盖
		void pop_front() {
			for (int i = 0; i < Getsize(); i++) {
				_array[i] = _array[i + 1];
			}
			_size--;
		}
		//按位置查找,
		T& find_pos(const size_t pos) {
			if (pos>0 && pos<=Getsize())
				 return _array[pos - 1];
		}
		//按值查找
		size_t find_val(const T& data) {
			for (int i = 0; i < Getsize(); i++) {
				if (_array[i] == data) {
					return (i + 1);
				}
			}
			return -1;
		}
		//按位置删除
		void pop_pos(const size_t& pos) {
			if (pos > 0 && pos <= Getsize()) {
				for (int i = pos - 1; i < Getsize(); i++) {
					_array[i] = _array[i + 1];
				}
			}
			_size--;
		}
		//打印数组
		void Show_List() {
			for (int i = 0; i < Getsize(); i++) {
				cout << _array[i] << " ";
			}
		}
		//封装迭代器
		iterator begin() {
			return (iterator)_array;
		}
		iterator end() {
			return (iterator)(_array+_size);
		}
		//冒泡排序
		void bubbing_sort() {
			for (int i = 0; i < Getsize(); i++) {
				for (int j = i + 1; j < Getsize(); j++) {
					if (_array[i] < _array[j]) {
						std::swap(_array[i], _array[j]);
					}
				}
			}
		}
		//根据位置修改数据
		void modifica_pos(const size_t& pos, const T& data) {
			if (pos > 0 && pos <= Getsize())
			     _array[pos - 1] = data;
	    }
		//修改数组中所有值为desc的数据
		void modifica_val_all(const T& desc, const T& data) {
			for (int i = 0; i < Getsize(); i++) {
				if (_array[i] == desc) {
					_array[i] = data;
				}
			}
		}
		//判空
		bool Is_empty() {
			return _size == 0;
		}
		//判满
		bool Is_full() {
			return _size == _capacity;
		}
		//清空数组
		~Seqlist()
		{
			delete[] _array;
			_array = nullptr;
			_capacity = _size = 0;
		}

	private:
		T* _array;
		size_t _capacity;
		size_t _size;
	private:
		//修改数组容量
		void change_capacity() {
			T* new_array = new T[sizeof(T) * _capacity * 2];
			memmove(new_array, _array, sizeof(T) * _capacity);
			delete[] _array;
			_array = new_array;
			_capacity = _capacity * 2;
		}

	};
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小明学编程~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值