手撕STL中的vector容器

记忆代码细节

	#include
	using namespace std;

	typedef int DATA_TYPE;


//顺序表
DATA_TYPE* pArr;//保存顺序表的首地址
size_t len;//顺序表元素个数

//初始化
void init();
//尾部插入
void push_back(const DATA_TYPE& data);
//遍历
void travel();

//删除的三种方式
void pop_front();
void pop_back();
void delete_pos(size_t n);


int main()
{
	init();
	for (int i = 0; i < 12; i++)
	{
		push_back(i);
		travel();
	}

	for (int i = 0; i < 12; i++)
	{
		delete_pos(1);
		travel();
	}

	return 0;
}

void travel()
{
	for (int i = 0; i < len; i++)
	{
		cout << pArr[i] << " ";
	}
	cout << endl;
}

void push_back(const DATA_TYPE& data)
{
#if 0
	if (pArr==NULL)
	{
		//1,开内存
		DATA_TYPE* pNew = new DATA_TYPE;
		//2,pArr指向新开的内存
		pArr = pNew;
		//3,数据进来  4,元素个数增长
		pArr[len++] = data;
	}
	else
	{
		//开内存
		DATA_TYPE* pNew = new DATA_TYPE[len + 1];
		//原pArr指向内存段中的数据拷贝到pNew指向的内存段
		memcpy(pNew, pArr, sizeof(DATA_TYPE) * len);
		//释放pArr指向的内存段
		delete[] pArr;
		//pArr指向新开的内存
		pArr = pNew;
		//数据进来  元素个数增长
		pArr[len++] = data;
	}
#else//优化上面的代码
	//开内存
	DATA_TYPE* pNew = new DATA_TYPE[len + 1];
	if (pArr)
	{
		//原pArr指向内存段中的数据拷贝到pNew指向的内存段
		memcpy(pNew, pArr, sizeof(DATA_TYPE) * len);
		//释放pArr指向的内存段
		delete[] pArr;
	}
	//pArr指向新开的内存
	pArr = pNew;
	//数据进来  元素个数增长
	pArr[len++] = data;

#endif
}

void init()
{
	pArr = NULL;
	len = 0;
}

void pop_front()
{
	if (pArr == NULL)
		return;
	if (1 == len)
	{
		delete[] pArr;
		pArr = NULL;
		len = 0;
		return;
	}
	//1,新开内存
	DATA_TYPE* pNew = new DATA_TYPE[len - 1];
	//数据拷贝
	memcpy(pNew, pArr + 1, sizeof(DATA_TYPE) * (len - 1));
	//3,释放原来的内存段
	delete[] pArr;
	//pArr指向新开的内存段
	pArr = pNew;
	//5,len减少
	len--;

}
void pop_back()
{
	if (pArr == NULL)
		return;
	if (1 == len)
	{
		delete[] pArr;
		pArr = NULL;
		len = 0;
		return;
	}

	//1,新开内存
	DATA_TYPE* pNew = new DATA_TYPE[len - 1];
	//数据拷贝
	memcpy(pNew, pArr, sizeof(DATA_TYPE) * (len - 1));
	//3,释放原来的内存段
	delete[] pArr;
	//pArr指向新开的内存段
	pArr = pNew;
	//5,len减少
	len--;

}
void delete_pos(size_t n)
{
	if (pArr == NULL)
		return;
	if (n >= len)
		return;
	if (0 == n)
	{
		pop_front();
		return;
	}
		
	if ((len - 1) == n)
	{
		pop_back();
		return;
	}
		
	//1,新开内存
	DATA_TYPE* pNew = new DATA_TYPE[len - 1];
	//先拷贝前面的
	memcpy(pNew, pArr, sizeof(DATA_TYPE) *n);
	//再拷贝后面的
	memcpy(pNew+n, pArr+n+1, sizeof(DATA_TYPE) * (len-1-n));
	
	
	//3,释放原来的内存段
	delete[] pArr;
	//pArr指向新开的内存段
	pArr = pNew;
	//5,len减少
	len--;

}
图灵奖获得者
	编程 == 数据结构+算法
编程语言描述事物的
	事	流程	算法	c  面向过程
	物	数据	数据结构  c++ 面向对象

数据结构:管理数据的结构,本身是无意义的
我们需要对数据做一些操作和数据本身的特性两方面看

数据的特性:
1,离散(数据间没有关系)  点		常量	变量	结构体	联合体	枚举
2,线性	  数组	链表	栈和队列	线性表	顺序表
3,树	二叉树	有序二叉树	AVL	完全二叉树	23树	B树	B+树	哈夫曼树
4,图	多对多	

顺序表:
	线性表=动态数组+链表




	1,功能 2,性能 3,美丽
	衡量代码性能
		1,时间
		2,空间
	空间上:已然没法优化
	时间上:每次插入数据都要开内存 都要拷贝
	10w个数据  开10次内存
	只有浪费空间来节约时间  没有绝对的最好 c++定的是1.5倍是最好的

然后类的封装 类模板的封装

你可能感兴趣的:(c/c++,c++)