一.适配器讲解
可维护性
设计模式
适配器模式 -- 封装转换
迭代器模式 -- 封装统一访问方式(数据结构访问都可以用)


C语言做这个过程只是太过麻烦,而不是不可以
下面是用C语言实现成员函数(C语言中,struct是没有成员函数的)
cpp
void PushBack(int x)
{
printf("void PushBack(int x)\n");
}
// C
struct Vector
{
void(*push_back)(int);
int* _a;
int _size;
int _capacity;
};
void Init(struct Vector* pv)
{
pv->push_back = PushBack;
//...
}
int main()
{
Vector v;
Init(&v);
v.push_back(1);
v.push_back(2);
return 0;
}

二.queue的实现
cpp
#pragma once
#include<vector>
#include<list>
#include<deque>
using namespace std;
namespace ltw
{
// deque list
// 不支持vector(vector没有直接支持头删(效率太低了))
template<class T, class Container = deque<T>>
class queue
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_front();
// 这样就可以支持vector了,但是效率就很低了
//_con.erase(_con.begin());
}
const T& back()
{
return _con.back();
}
const T& front()
{
return _con.front();
}
bool empty()
{
return _con.empty();
}
size_t size()
{
_con.size();
}
private:
Container _con;
};
}
queue的实现,是不建议使用vector进行当作适配器的
测试代码:
cpp
void test_queue()
{
ltw::queue<int> q;
//ltw::queue<int,list<int>> q;
// 不支持
//ltw::queue<int, vector<int>> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}
cout << endl;
}
只能说是,任何容器(逻辑差不多的容器)都能通过特定的方式被当作适配器,但是效率不同
三.stack和queue的默认适配容器(deque)

1.deque的成员函数等


从功能上,我们都基本上都清楚了
2.vector,list和deque的优劣分析



deque就相当于是vector和list的结合体
deque的[]访问的效率不如vector,insert的效率不如list
3.测试代码(了解即可):
测试vector和deque排序(全是[]访问):
cpp
void test_op1()
{
srand(time(0));
const int N = 1000000;
deque<int> dq;
vector<int> v;
for (int i = 0; i < N; ++i)
{
auto e = rand() + i;
v.push_back(e);
dq.push_back(e);
}
int begin1 = clock();
sort(v.begin(), v.end());
int end1 = clock();
int begin2 = clock();
sort(dq.begin(), dq.end());
int end2 = clock();
printf("vector:%d\n", end1 - begin1);
printf("deque:%d\n", end2 - begin2);
}

让vector进行排序,排完再拷贝回去:
cpp
void test_op2()
{
srand(time(0));
const int N = 1000000;
deque<int> dq1;
deque<int> dq2;
for (int i = 0; i < N; ++i)
{
auto e = rand() + i;
dq1.push_back(e);
dq2.push_back(e);
}
int begin1 = clock();
sort(dq1.begin(), dq1.end());
int end1 = clock();
int begin2 = clock();
// 拷贝到vector
vector<int> v(dq2.begin(), dq2.end());
sort(v.begin(), v.end());
dq2.assign(v.begin(), v.end());
int end2 = clock();
printf("deque sort:%d\n", end1 - begin1);
printf("deque copy vector sort, copy back deque:%d\n", end2 - begin2);
}










