平时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、&之类的东东,我暂时还不会用,应该是为了更加安全吧不是很懂~
有大佬懂的话希望能给我指个路,好让我去学习学习。