C++:vector的模拟实现

一、vector的成员、构造、析构、迭代器的基本实现

下图是vector的基本结构:

在这里插入图片描述


#pragma once
#include<iostream>
#include<assert.h>

namespace Myvector{
   
	template<class T>
	class vector {
   
	public:
		//因为vector的底层是连续的,所以可以使用原生指针来当作迭代器使用
		typedef T* iterator;	
		typedef const T* const_iterator;	//const引用const迭代器
		
		iterator begin() {
   
			return _start;
		}
		iterator end() {
   
			return _finish;
		}

		const_iterator begin() const{
   
			return _start;
		}

		const_iterator end() const{
   
			return _finish;
		}
		//当前vector元素的有效个数
		size_t size(){
   
			return _finish - _start;
		}
		//当前vector容器的个数
		size_t capacity() {
   
			return end_of_storage - _start;
		}
		
		//构造函数,构造一个空的vector
		vector():
		_start(nullptr),_finish(nullptr),end_of_storage(nullptr)
		{
   }
		
		//vector的析构函数
		~vector() {
   
			delete[]_start;
			_start = _finish = end_of_storage = nullptr;
		}
		
	private:
		iterator _start;
		iterator _finish;
		iterator end_of_storage;
	}
}

二、check_capacity、reserve方法

在这里插入图片描述

check_capacity判断是否达到扩容条件

void check_capacity() {
   
		if (_finish == end_of_storage) {
   
			//当最初的时候,容量为0,要给个初始值
			size_t newcapacity = capacity() == 0 ? 1 : 2 * capacity();
			reserve(newcapacity);
		}
	}

reserve实现重新配置、元素移动、释放原空间

	void reserve(size_t n) {
   
		if (n > capacity()) {
   
			size_t sz = size();	//保存原有vector的大小
			T* tmp = new T[n];	//重新配置新空间
			//	memcpy(tmp,_start,sizeof(T)*size()); 出现深浅拷贝问题
			if(_start)
			for(size_t i=0;i<sz;i++){
   
				tmp[i] = _start[i];
			}
			
			delete[] _start;	//释放原空间
			
			//将vector的指针指向新配置的空间
			_start = tmp;		
			_finish = _start + sz;
			end_of_storage 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值