C++语法(11)---- 模拟实现list_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/129773011目录
1.设计模式
设计模式是写代码的一种策略,面对项目有套路的设计,这里只介绍几种设计模式
1.迭代器模式,stl中的迭代器在封装后不暴露内部细节,使得上层使用时达到一种统一的方法访问
2.适配器模式,用于转换,通关原有的内容封装转换出自己想要的东西
2.实现stack
自己想要实现,需要数组一点一点堆上去,但是适配器模式下,我们想想是否可以用写过的stl来实现呢?其实答案很明显vector和list可以来封装转化
stack用vector更好,因为删除只涉及尾删
下面是细节代码
#pragma once
#include<iostream>
#include<vector>
#include<list>
namespace MY
{
template<class T,class Container = vector<T>>
class stack
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
const T& top()
{
return _con.back();
}
bool empty()
{
return _con.empty();
}
size_t size()
{
return _con.size();
}
private:
Container _con;
};
}
3.实现queue
如法炮制,queue也可以使用适配器模式封装来得到自己想要的
queue用list更好,因为只支持头删,vector头删效率低
#pragma once
#include<iostream>
#include<vector>
#include<list>
namespace MY
{
template<class T, class Container = list<T>>
class queue
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_front();
}
const T& front()
{
return _con.front();
}
const T& back()
{
return _con.back();
}
bool empty()
{
return _con.empty();
}
size_t size()
{
return _con.size();
}
private:
Container _con;
};
}
4.deque
1.我们之前讲过,list和vector各有优缺点,那么是否有一个stl可以弥补二者的缺点呢
2.deque就是这样一个数据结构,他头尾插入删除效率高,且支持随机访问
不过,它真的万金油吗?这就需要介绍一下它的具体实现方式了
1.其实现模式大致如此,即一个指针数组指向多个数组,在中间开始
2.头插就是将数据往最前面的数组尾部向前插入
3.尾插就是将数据往最后面的数组尾部向后插入
4.对于随机访问就是通过取模等一系列运算找到某个特定数组的下标,那么我们知道其实随机访问的数据量很大,其实这些取模的运算也耗费时间,不如vector的直接随机访问
5.对于中间插入,还需要把后面的或者前面的数据往两边移动,会发现如果数据量庞大,别说移动的耗费时间效率,实现也是一个非常恼人的操作,对比其list的中间插入只需要改变指针指向相比确实差得远了
6.如果数据过大,这些存数据的数组不需要改变,只需要改变指针数组的容量,随后将里面的内容复制,再释放原来的空间
7.如果针对要计较起来,其实数据浪费也有存在,这个得看数组的设计容量多大和实际数据的大小对比了