c++ 模板/类(vector容器的粗糙实现)

平时STL用起来十分的方便,但却一直没有深入了解过其中的实现原理,所以今天就粗略的用自己有限的知识实现vector容器的部分功能。

首先vector容器的原理并不复杂:动态申请内存和释放内存。
之前一直想着动态申请内存要使用realloc(),当空间不足就追加适当的空间,但是具体自己做的时候发现,如果追加空间那么如果后面的空间被占了怎么办呢?毕竟vector空间的地址是一个连续的线性空间,如果直接追加会造成意想不到的情况。所以应该另外开辟新的空间将之前的元素存放进去。

不废话了~~~

#pragma once//保证头文件不会被include多次
template <class T>
class MyVector {
private:
	T *element; //存放数据元素
	int curSize;  //当前尺寸
	int capacity; //总容量

	void resize(int newSize) {     //分配空间,之前的元素复制到新空间
		T *newData = new T[newSize];
		for (int i = 0; i < curSize; i++) {
			newData[i] = element[i];
		}
		delete[] element;
		element = newData;
		capacity = newSize;
	}
public :
	MyVector() {     //默认初始化大小为10
		element = new T[10];
		capacity = 10;
		curSize = 0;
	}
	~MyVector() {    //销毁
		delete[] element;
	}
	MyVector(int newSize) {//初始化给予指定空间: Myvector<typename> arr(n);
		element = new T[newSize * 2];
		capacity = newSize * 2;
		curSize = newSize;
	}

	void push_back(T e) {
		if (curSize == capacity) { //如果空间满了先申请空间
			resize(capacity * 2);
		}
		element[curSize] = e;
		curSize++;
	}
	void pop_back() {
		if (curSize == 0) {
			throw out_of_range("Wrong!!当前容器尺寸为0!");//抛出异常
		}
		T temp = element[curSize - 1];
		curSize--;

		if (curSize <= capacity / 4) {
			resize(capacity / 2);
		}
	}
	T back() {
		if (curSize == 0) {
			throw out_of_range("Wrong!!当前容器尺寸为0!");//抛出异常
		}
		return element[curSize - 1];
	}
	bool empty() {
		if (curSize == 0)
			return true;
		return false;
	}
	int size() {
		return curSize;
	}
	T &operator[](int i) {//重载[]
		return element[i];
	}
};

测试代码:

#include<iostream>
#include<string>
#include"MyVector.h"
using namespace std;
MyVector<string> arr;
//MyVector<string> arr(10);
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;
		arr.push_back(s);
	}
	cout << "当前arr.size() = " << arr.size() << endl;
	cout << "末尾元素 = " << arr.back() << endl;
	arr.pop_back();
	cout << "末尾元素退出后arr.size() = " << arr.size() << endl;
	if (arr.empty()) {
		cout << "容器为空!\n";
	}
	else cout << "容器不为空!\n";
	return 0;
}

关于每次扩容为什么要以2倍增加:https://blog.csdn.net/bryant_xw/article/details/89524910

网上大佬们总是用const、&之类的东东,我暂时还不会用,应该是为了更加安全吧不是很懂~
有大佬懂的话希望能给我指个路,好让我去学习学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值