当前位置: 首页 > news >正文

C++:vector容器(下篇)

1.vector容器机制

2.vector模拟与实现

#pragma once
#include <assert.h>

namespace room
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		// 指向数据不能修改,本身可以修改
		typedef const T* const_iterator;

		iterator begin()
		{
			return _start;
		}

		iterator end()
		{
			return _finish;
		}

		const iterator begin() const
		{
			return _start;
		}

		const iterator end() const
		{
			return _finish;
		}

		vector()
		{}

		vector(initializer_list<T> il)
		{
			reserve(il.size());
			for (auto& e : il)
			{
				push_back(e);
			}
		}

		// 类模板的成员函数,也可以是一个函数模板
		// 这里就不知限制只有vector的迭代器初始化,string、list等迭代器都可以用
		template <class InputIterator>
		vector(InputIterator first, InputIterator last)
		{
			while (first != last)
			{
				push_back(*first);
				++first;
			}
		}
		// v(10, 1.1)
		vector(size_t n, const T& val = T())
		{
			resize(n, val);
		}

		// 这里是为了避免使用上面的模板
		// 所以搞出来两份
		// v(10, 1)
		vector(int n, const T& val = T())
		{
			resize(n, val);
		}

		// 拷贝构造
		// v2(v1)
		//vector(const vector& v)
		vector(const vector<T>& v)
		{
			reserve(v.size());
			for (auto& e : v)
			{
				push_back(e);
			}
		}

		// 传统写法
		// v1 = v3
		//vector& operator=(const vector& v)
		//vector<T>& operator=(const vector<T>& v)
		//{
		//	if (this != &v)
		//	{
		//		delete[] _start;
		//		_start = _finish = _end_of_storage = nullptr;
		//		reserve(v.size());
		//		for (auto& e : v)
		//		{
		//			push_back(e);
		//		}
		//	}

		//	return *this;
		//}

		void swap(vector<T>& v)
		{
			std::swap(_start, v._start);
			std::swap(_finish, v._finish);
			std::swap(_end_of_storage, v._end_of_storage);
		}

		// v1 = v3
		vector<T>& operator=(vector<T> v)
		{
			swap(v);

			return *this;
		}

		~vector()
		{
			delete[] _start;
			_start = _finish = _end_of_storage = nullptr;
		}

		void resize(size_t n, const T& val = T())
		{
			if (n < size())
			{
				_finish = _start + n;
			}
			else
			{
				reserve(n);
				while (_finish != _start + n)
				{
					*_finish = val;
					++_finish;
				}
			}
		}

		void reserve(size_t n)
		{
			if (n > capacity())
			{
				size_t oldSize = size();
				T* tmp = new T[n];
				// memcpy是一个浅拷贝,会出问题
				// 当拷贝一个字符串时,就会出现问题
				//memcpy(tmp, _start, sizeof(T) * oldSize);
				// 深拷贝
				for (size_t i = 0; i < oldSize; ++i)
				{
					tmp[i] = _start[i];
				}
				delete[] _start;

				_start = tmp;
				_finish = _start + oldSize;
				_end_of_storage = _start + n;
			}
		}

		T& operator[](size_t i)
		{
			assert(i < size());

			return _start[i];
		}

		const T& operator[](size_t i) const
		{
			assert(i < size());

			return _start[i];
		}

		size_t size() const
		{
			return _finish - _start;
		}

		size_t capacity() const
		{
			return _end_of_storage - _start;
		}

		void push_back(const T& x)
		{
			// 扩容
			if (_finish == _end_of_storage)
			{
				reserve(capacity() == 0 ? 4 : capacity() * 2);
			}
			*_finish = x;
			++_finish;
		}	

		void pop_back()
		{
			assert(_finish > _start);
			--_finish;
		}

		 迭代器失效
		//void insert(iterator pos, const T& x)
		//{
		//	assert(pos >= _start);
		//	assert(pos <= _finish);

		//	// 满了就扩容
		//	if (_finish == _end_of_storage)
		//	{
		//		reserve(capacity() == 0 ? 4 : capacity() * 2);
		//	}

		//	iterator it = _finish - 1;
		//	while (it >= pos)
		//	{
		//		*(it + 1) = *it;
		//		--it;
		//	}

		//	*pos = x;
		//	++_finish;
		//}

		void insert(iterator pos, const T& x)
		{
			assert(pos >= _start);
			assert(pos <= _finish);

			// 满了就扩容,导致pos失效,失效后不能使用,更新后才能使用
			if (_finish == _end_of_storage)
			{
				size_t len = pos - _start;
				reserve(capacity() == 0 ? 4 : capacity() * 2);
				pos = _start + len;
			}

			iterator it = _finish - 1;
			while (it >= pos)
			{
				*(it + 1) = *it;
				--it;
			}

			*pos = x;
			++_finish;
		}

		 迭代器失效 
		//void erase(iterator pos)
		//{
		//	assert(pos >= _start);
		//	assert(pos < _finish);

		//	iterator it = pos + 1;
		//	while (it < _finish)
		//	{
		//		*(it - 1) = *it;
		//		++it;
		//	}

		//	--_finish;
		//}

		iterator erase(iterator pos)
		{
			assert(pos >= _start);
			assert(pos < _finish);

			iterator it = pos + 1;
			while (it < _finish)
			{
				*(it - 1) = *it;
				++it;
			}

			--_finish;

			return pos;	// 下一个位置还是pos
		}

	private:
		iterator _start = nullptr;
		iterator _finish = nullptr;;
		iterator _end_of_storage = nullptr;;
	};
}

相关文章:

  • CI/CD—Jenkins配置一次完整的jar自动化发布流程
  • Hadoop安装文件解压报错:无法创建符号链接。。。
  • C++11 `enum class`
  • CSGO开箱网盲盒源码搭建与成品演示解析
  • 多视图几何--相机标定--DTL进行相机标定
  • 每日学Java之一万个为什么
  • C++函数高阶
  • 19天 - HTTP 1.0 和 2.0 有什么区别?HTTP 2.0 和 3.0 有什么区别?HTTP 和 HTTPS 有什么区别?
  • 单元测试、系统测试和集成测试知识总结
  • 物联网在电力行业的应用
  • 网络DNS怎么更改?
  • 【前端】BOM DOM
  • Fuel 爬虫:Scala 中的图片数据采集与分析
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14基础固定表头示例
  • HTTP拾技杂谈
  • 16、流量控制是怎么实现的?【中高频】
  • Django 5实用指南(十四)项目部署与性能优化【完】
  • 非线性优化--NLopt算法(Android版本和Python示例)
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_01基础固定表头示例
  • 单调栈、单调队列
  • 洞天寻隐·学林纪丨玉洞桃源:仇英青绿山水画中的洞天与身体
  • 2025上海科技节将于5月17日开幕,拟设6大板块专题活动
  • 陕西澄城打造“中国樱桃第一县”:从黄土高原走向海外,年产值超30亿
  • 习近平向“和平薪火 时代新章——纪念中国人民抗日战争和苏联伟大卫国战争胜利80周年中俄人文交流活动”致贺信
  • 赵乐际:深入学习贯彻习近平生态文明思想,推动森林法全面有效贯彻实施
  • 上海车展侧记|中国汽车产业的韧性从何而来