【C++/STL】vector的底层刨析和模拟实现

07-07 1788阅读

【C++/STL】vector的底层刨析和模拟实现

✨                               生于火焰,落俗不可避免,但浪漫至死不渝       🌏 

📃个人主页:island1314

🔥个人专栏:C++学习

🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏  💞 💞 💞


目录

vector模拟实现完整代码:

1.vector成员变量

🍵构造函数

📘默认构造

📘拷贝构造

📘迭代器区间初始化

📘n个val构造

📘initializer_list构造

📘赋值运算符重载

2、有关容量和数据个数的函数

3、扩容reserve()

4、operate[]

5、析构函数

6、尾插push_back

7、迭代器

迭代器代码测试:

8、插入insert

9、删除erase

🍋课外知识点:

🍵结语



vector模拟实现完整代码:

#pragma once
#include 
namespace qian {
	template
	class vector
	{
	public:
		typedef const T* const_iterator;
		typedef T* iterator;
		const_iterator begin() const
		{
			return _start;
		}
		const_iterator end() const
		{
			return _finish;
		}
		iterator begin()
		{
			return _start;
		}
		iterator end()
		{
			return _finish;
		}
		//类模板的成员函数,迭代器区间初始化
		//函数模板  -- 目的支持任意容器迭代器区间初始化
		template 
		vector(InputIterator first, InputIterator last)
		{
			//reserve(last - first);
			while (first != last)
			{
				push_back(*first);
				++first;
			}
		}
		//n个val构造
		vector(size_t n, const T& val = T())//缺省值不能给0,因为T可能是string,所以给匿名对象T()
		{
			reserve(n);
			while(n--)
			{
				push_back(val);
			}
		}
		
		//n个val构造,第一个参数为int类型
		vector(int n, const T& val = T())//缺省值不能给0,因为T可能是string,所以给匿名对象T()
		{
			reserve(n);
			while(n--)
			{
				push_back(val);
			}
		}
		//initializer_list构造
		vector(initializer_list il)
		{
			reserve(il.size());
			for (auto e : il)
			{
				push_back(e);
			}
		}
		//默认构造
		vector()
			:_start(nullptr)
			, _finish(nullptr)
			, _endOfStorage(nullptr)
		{}
		
		// v2 (v1)
		vector(const vector& v)
		{
			reserve(v.capacity());
			for (auto e : v) push_back(e);
		}
		void swap(vector& v)
		{
			std::swap(_start, v._start);
			std::swap(_finish, v._finish);
			std::swap(_end_of_storage, v._end_of_storage);
		}
		// v1 = v3
		vector& operator = (vector v)
		{
			swap(v);
			return *this;
		}
		~vector()
		{
			if (_start)
			{
				delete[] _start;
				_start = _finish = _end_of_storage = nullptr;
			}
		}
		void reserve(size_t n) //开辟空间
		{
			if (n > capacity())
			{
				size_t oldsize = size(); //保存旧空间
				T* tmp = new T[n];
				if (_start)
				{
					for (size_t i = 0; i  0);
			--_finish;*/
			 erase(--end());
		}
		iterator insert(iterator pos, const T& x)
		{
			assert(pos >= _start);
			assert(pos = pos)
			{
				*(end + 1) = *end;
				--end;
			}
			*pos = x;
			++_finish;
			return pos;
		}
		iterator erase(iterator pos)
		{
			assert(pos >= _start);
			assert(pos 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]