C++实现简单的vector容器

目录

概述

vector类定义

构造函数和析构函数

尾插push_back()

某个位置插入元素insert()

其他成员函数

测试代码test.cpp

总结


概述

vector容器的底层原理其实就是一个顺序表,将一个指针(指向开辟数组)和两个(数组相关参数,数组元素个数和开辟空间大小)封装到一个类里面,作为类的属性。然后再通过定义各种接口函数作为成员函数实现vector容器的功能。

注:文章借鉴了下面这篇博客,谢谢大佬的分享,让我学习到了更多的知识,抱拳抱拳https://blog.csdn.net/weixin_50941083/article/details/122354948

vector类定义

vector容器其实是一个类模板,使得容器可以存放各种类型的元素,vector类的定义如下,包括属性、成员函数和运算符重载几部分,MyVector.h文件。

#pragma once
#include<iostream>
#include<algorithm>
#include<numeric>

using namespace std;
#define InitCapacity 8

//创建vector类模板
template<typename T>
class vector {
public:
	typedef T dataType;//把类型换个名字
	typedef T* iterator;//vector中迭代器的含义

public:
	dataType* _data;//vector属性  存放数据的空间
	int _size;//存放数据的数量
	int _capacity;//已开辟空间的大小

public:
	vector();//无参构造函数 初始化
	vector(const vector& vec);//拷贝构造函数
	vector& operator=(const vector& vec)//赋值运算符重载
	{
		//释放原来的空间  深拷贝
		delete[] this->_data;
		//重新拷贝过来
		this->_capacity = vec._capacity;
		this->_data = new dataType[this->_capacity];
		for (int i = 0; i < vec._size; i++) {
			this->_data[i] = vec._data[i];
		}
		this->_size = vec._size;
		return *this;
	}
	bool operator==(const vector& vec)//等号关系运算符重载
	{
		if (this->_size != vec._size)
			return false;
		for (int i = 0; i < vec._size; i++) {
			if (this->_data[i] != vec._data[i])
				return false;
		}
		return true;
	}
	dataType& operator[](size_t i)//[]运算符重载
	{
		return this->_data[i];
	}
	void check_capacity();//检查容量
	void push_back(dataType val);//尾插一个元素val
	void insert(iterator pos, dataType val);//在某个位置插入元素val
	void pop_back();//尾删
	void erase(iterator pos);//删除某一位置元素
	dataType front();//获取头部元素
	dataType back();//获取尾部元素
	iterator begin();//头指针
	iterator end();//尾指针
	int size();//元素个数
	int capacity();//容量大小
	bool empty();//是否为空

	~vector();//析构函数 释放

};

构造函数和析构函数

构造函数和析构函数是创建类首先要定义的,构造函数主要用于创建对象时对成员变量进行初始化;析构函数主要用于释放为实例化对象所分配的空间,当某个对象离开自己的作用域时就会自动调用析构函数,释放空间。

template<typename T>//类模板成员函数类外实现必须要加模板标识
vector<T>::vector() {
	this->_data = NULL;
	this->_size = 0;
	this->_capacity = 0;
}

template<typename T> //拷贝构造函数
vector<T>::vector(const vector& vec) {
	this->_capacity = vec._capacity;
	this->_data = new dataType[this->_capacity];
	for (int i = 0; i < vec._size; i++) {
		this->_data[i] = vec._data[i];
	}
	this->_size = vec._size;
}

template<typename T>//且每一个成员函数都要加模板标识 而且在使用时必须再包含.cpp文件
vector<T>::~vector() {
	delete[] this->_data;
	this->_data = NULL;
	this->_capacity = 0;
	this->_size = 0;
}

尾插push_back()

插入元素的时候一定要判断已开辟的空间的大小是否足够,由此创建了check_capacity()函数:

template<typename T>
void vector<T>::check_capacity() {//检查容量
	if (0 == this->_capacity) {//最开始的
		this->_capacity = InitCapacity;
		this->_data = new dataType[this->_capacity];
		return;
	}
	if (this->_size == this->_capacity) {//已经填满了
		this->_capacity *= 2;
		dataType* tmp = new dataType[this->_capacity];//创建一个临时的空间存放以前的数据
		for (int i = 0; i < this->_size; i++) {
			tmp[i] = this->_data[i];
		}
		delete[] this->_data;//释放原来的空间
		this->_data = tmp;//现在指向新创建的空间
	}
}

template<typename T>
void vector<T>::push_back(dataType val)//尾插一个元素val  插入需要判断容量
{
	this->check_capacity();//判断容量
	this->_data[this->_size] = val;
	this->_size++;
}

某个位置插入元素insert()

要想在某一位置插入元素,原理如图:

 

template<typename T>
void vector<T>::insert(iterator pos, dataType val)//在某个位置插入元素val
{
	this->check_capacity();//判断容量
	int index = pos - this->_data;
	for (int i = this->_size - 1; i >= index; i--) {
		this->_data[i + 1] = this->_data[i];
	}
	this->_data[index] = val;
	this->_size++;
}

其他成员函数

template<typename T>
void vector<T>::pop_back()//尾删
{
	this->_size--;
}

template<typename T>
void vector<T>::erase(iterator pos)//删除某一位置元素
{
	int index = pos - this->_data;
	for (int i = index; i < this->_size - 1; i++) {
		this->_data[i] = this->_data[i + 1];
	}
	this->_size--;
}

template<typename T>
T vector<T>::front()//获取头部元素
{
	return this->_data[0];
}

template<typename T>
T vector<T>::back()//获取尾部元素
{
	return this->_data[this->_size - 1];
}

template<typename T>
T* vector<T>::begin()//头指针
{
	return this->_data;
}

template<typename T>
T* vector<T>::end()//尾指针
{
	return this->_data + this->_size;
}

template<typename T>
int vector<T>::size()//元素个数
{
	return this->_size;
}

template<typename T>
int vector<T>::capacity()//容量大小
{
	return this->_capacity;
}

template<typename T>
bool vector<T>::empty()//是否为空
{
	return this->_size == 0;
}

测试代码test.cpp

#include"MyVector.h"
#include"MyVector.cpp"

int main() {
	vector<string> vec;//无参构造
	vec.push_back(string("xiaoming"));//尾插
	vec.push_back(string("xiojun"));
	vec.push_back(string("xiaomei"));
	vec.push_back(string("xiaoxin"));

	vector<string> vec1(vec);//拷贝构造
	if (vec == vec1) {//重载==运算符
		cout << "vec vec1两个顺序表相等" << endl;
	}
	vector<string> vec2 = vec;//重载=运算符
	if (vec1 == vec2) {
		cout << "vec1 vec2两个顺序表相等" << endl;
	}
	cout << "元素为vec[1] = " << vec[1] << endl;//重载[]运算符

	vec.insert(vec._data, string("xiaofang"));//某个位置插入,迭代器传参

	vec.pop_back();//尾删
	vec.pop_back();

	vec.erase(vec._data);//删除元素

	cout << "第一个元素为:" << vec.front() << endl;
	vec.push_back(string("xiaocao"));
	vec.push_back(string("xiaotang"));
	cout << "最后一个个元素为:" << vec.back() << endl;
	cout << "元素个数为:" << vec.size() << endl;
	cout << "空间容量为:" << vec.capacity() << endl;
	cout << "是否为空:" << vec.empty() << endl;
	cout << "遍历整个顺序表************************" << endl;
	for (vector<string>::iterator it = vec.begin(); it != vec.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;

	return 0;
}

总结

文章描述了通过C++实现vector容器的过程,在这其间,加深了对C++类和对象特性的理解;明白了标准类模板的实现原理;也用到了相关数据结构、内存分配与释放等知识,是一个简单且有意义的实验。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值