c++还原简单的vector_[&](const vector<uint8_t> &_data) -> bool

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

迭代器

这里的迭代器iterator可看作为指针

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()//构造函数
    //这里用初始化列表比较方便
			:\_start(nullptr)
			,\_finish(nullptr)
			,\_endofstorage(nullptr)
		{}

析构函数
~vector()//析构函数
		{
			delete[] _start;
			_start = _finish = _endofstorage = nullptr;
		}

size()

指针相减 得指针之间成员个数

size_t size() const//size---有效成员个数
		{
		return 	_finish - _start;
		}

capacity()
	size_t capacity()const//capacity---容量
		{
			return _endofstorage - _start;
		}

operator[]重载
T& operator[](size_t pos)
		{
			assert(pos < size());
			return T[pos];
		}

const T& operator[](size_t pos) const
		{
			assert(pos < size());
			return T[pos];
		}

扩容
void reserve(size_t n)
{
  if (n > capacity())
  {
  size_t oldsize = size();//记录成员个数
  T\* tmp = new T[n];//开辟新空间
  if (_start)//如果\_start指向的空间不为空就要拷贝数据
  {
         //把\_start的数据拷贝到tmp上面
		//memcpy(tmp, \_start, sizeof(T) \* oldsize);//这里实现了浅拷贝
                    //后面会谈到memcpy的弊端
      for(size_t i=0;i<oldsize;i++)
           {
                   tmp[i]=_start[i];//这里实现深拷贝
           }
		//删除旧空间-空间不为空才需要释放
          delete[]_start;
	}
		_start = tmp;//指向新空间
//原来的size=\_finish-\_start,而此时的\_start是新空间的\_start, //\_finish是旧空间的\_finish,相减得出不是之间成员个数了;所以我们要用oldsize()来记录先前的成员个数,用新的\_start+oldsize()得出新的\_finish
				_finish = _start + oldsize;
				_endofstorage = _start + n;
 }
}

resize()

image-20221206160315297

void resize(size_t n, T val = T())//value\_type val 给匿名对象
//n<size():缩容;
//size()<n<capacity():用val初始化有效成员以外的成员变量;
//n>capacity():扩容且用val初始化有效成员以外的成员变量; 
{
    
			if (n > capacity())//n大于容量
			{
				reserve(n);//扩容
			}
			if (n > size())
			{
				while (_finish < _start + n)
				{//用val初始化有效成员以外的成员变量;
					\*_finish = val;
					++_finish;
				}
			
			}
			else
			{
				_finish = _start + n;//缩size()
			}
		}

尾插

image-20221206160248020

void push\_back(const T& x)//尾插
		{
			if (_finish == _endofstorage)//扩容
			{
				size_t newcapacity = capacity() == 0 ? 4 : capacity() \* 2;
				reserve(newcapacity);
			}
			\*_finish = x;
			++_finish;
		}

验证是否为空

image-20221206160336743

bool empty()const
		{
			return _start == _finish;
		}

尾删

image-20221206160354972

void pop\_back()
		{
			assert(!empty());
			--_finish;
		}

clear 清除

image-20221206160408484

void clear()//清理---不影响容量
		{
			_finish = _start;
		}

swap交换

image-20221206160423909

void swap(vector<T>& v)//交换
{//这里要指明是std库里的swap,因为头文件展开后从上往下找swap函数不一定先找到的是std库里的swap,还可能是vector的swap
			std::swap(_start, v._start);
			std::swap(_finish, v._finish);
			std::swap(_endofstorage,v._endofstorage);
		}

insert插入

这里我们实现第一个接口

image-20221206160542301

//迭代器失效:当插入时要扩容,pos指针指向原来的空间,而\_start指向新空间,在挪动数据时会出问题
		iterator insert(iterator pos, const T& val)
		{//pos要在\_start和\_finish之间
			assert(pos >= _start);
			assert(pos < _finish);

			//\_start为空时插入要扩容或者容量满了都要扩容
			if (  _finish==_endofstorage)
			{
				size_t len = pos - _start;//记录pos的相对位置
				size_t newcapacity = capacity() == 0 ? 4 : capacity() \* 2;
				reserve(newcapacity);
				pos = _start + len;//针对迭代器失效要对pos更新
			}
			iterator end = _finish - 1;
			while (end >= pos)//挪动数据
			{
				\*(end + 1) = \*(end);
				--end;
			}
			\*(pos) = val;
			++_finish;	
            return pos;
		}

erase删除

这里我们实现第一个接口

image-20221206160618001

	iterator erase(iterator pos)
		{
			assert(pos >= _start);
			assert(pos < _finish);
			iterator begin=pos+1;
			while (begin<_finish)
			{
				\*(begin-1) = \*(begin );
				++begin;
			}
			--_finish;
			return pos;//返回迭代器
		}

在这里我们创建一个vector往里面尾插1234;之后我们删除4;并且打印删除后的迭代器位置

image-20221205160153100

这里我们运行了看起来没有问题,实际上问题很大!删除4后容器的数据只有123,而我们访问到了4—野指针越界访问! 这里我们实现的模拟跟Linux系统下相似,所以在Linux系统下也不会报错;但我们如果删除的是2或者是3呢?会越界吗?换句话说:迭代器会失效吗?答:在Linux系统下迭代器可能会失效也可能不会!但在vs下必然失效!

这里我们换库里面的vector的erase试一下

image-20221205161257821

果然在vs下对迭代器做了更严格的检查,读都不给读,更何况是写;—迭代器失效了吗???好像失效了,这里有人会说你这个删除4肯定是越界了,那我删除别的对象不就不越界了嘛?

好现在我们删除2

image-20221205161333702

照样报错!所以我们使用完迭代器之后最好就不要再用迭代器了

如果硬要用就更新迭代器!

删除4—会被断言出越界

image-20221205162933187

删除2—更新了迭代器不会报错

image-20221205163424455

现在在vs还是Linux下都不会发生迭代器失效了,若越界直接断言!

迭代器区间初始化构造函数
		template <class InputIterator>
		vector(InputIterator first, InputIterator last)
            //构造函数:用迭代器区间去初始化
			: \_start(nullptr)
			, \_finish(nullptr)
			, \_endofstorage(nullptr)
		{
			while (first != last)
			{
				push\_back(\*first);
				++first;
			}
		}

拷贝构造

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

		{
			push\_back(\*first);
			++first;
		}
	}

#### 拷贝构造




[外链图片转存中...(img-9YCPE90m-1715737407912)]
[外链图片转存中...(img-9L7gQhhG-1715737407912)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值