容器适配器思想,参考帖子:http://bbs.csdn.net/topics/310196740
adapter原意是插座、适配器、接合器的意思。现在我需要一个栈结构,我们可以用deque来实现,只在一端进行元素插入和弹出,另一端不动。这说明deque可以用作一个栈结构,但它又不能直接地严格地满足你的要求,因为你不能防止别人在另一端乱动你的东西。你需要对它进行一些包装,作一些限制,使之只能在一端进行插入和删除。也就是说你必须提供一个“插座”,这个“插座”一端插在deque上,另一端插在你的程序中,你就可以使用栈结构了。而stack就是这样的“插座”,它连接了deque和你的程序。表面上看你使用的是stack,实际上你是通过stack这个“插座”来使用deque(因为stack完全是用deque来实现的,它并没有任何其他的东西,它只是在deque上面作了一层包装,相当于一个“插座”的功能)。因此,stack、queue、priority_queue这样的类一般称为容器适配器,它们只是基本容器类型(vector,dequeue,list)的适配。
实际上,这也适配器模式的基本思想:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。也就是说,在一个类的接口上提供一个“插座”类,使它变成你希望使用的接口。
1.stack
容器接口类,提供对其他容器的包装接口,仅允许对容器进行stack操作时使用。
stack类允许在底层数据结构的一端执行插入和删除操作(先入后出)。
堆栈能够用任何序列容器实现:vector、list、deque。
堆栈的操作包括:
1.将一个元素插入到堆栈顶部的push函数(通过调用底层容器的push_back函数实现)
2.从堆栈的顶部删除一个元素的pop函数(通过调用底层元素的pop_back函数实现)
3.获取堆栈顶部元素引用的top函数(通过调用底层容器的back函数实现)
4.判断堆栈是否为空的empty函数(通过调用底层容器的empty函数实现)
5.获取堆栈元素数量的size函数(通过调用底层容器的size函数实现)
为了获得最佳性能,应使用vector类作为stack的底层容器
常用函数,参考连接:http://www.howsoftworks.net/cplusplus.api/std/indexstack.html
示例代码:
int _tmain(int argc, _TCHAR* argv[])
{
//stack<int> intDequeStack; //stack适配器:默认为deque实现
//intDequeStack.push(2);
//intDequeStack.push(6);
//intDequeStack.push(3);
//cout << intDequeStack.top() << endl;
//intDequeStack.pop();
//cout << intDequeStack.top() << endl;
//vector<int> vectorInt = { 1, 2, 3, 4, 5 };
//stack<int, vector<int>> VecotrStack(vectorInt); //stack适配器:Vector实现
VecotrStack.push(2);
VecotrStack.push(6);
VecotrStack.push(3);
//cout << VecotrStack.top() << endl;
//VecotrStack.pop();
//cout << VecotrStack.top() << endl;
list<int> listInt = { 1, 2, 3, 4, 5 };
stack<int, list<int>> ListStack(listInt); //stack适配器:list实现
//VecotrStack.push(2);
//VecotrStack.push(6);
//VecotrStack.push(3);
cout << ListStack.top() << endl;
ListStack.pop();
cout << ListStack.top() << endl;
return 0;
}
2.queue
容器接口类,提供对其他容器的包装接口,提供对前后两端元素的有限制访问,可在back增加元素和在front移除元素。
queue类允许在底层数据结构的末尾插入元素,也允许从前面插入元素(先入先出)。
队列能够用STL数据结构的list和deque实现,默认情况下是用deque实现的。
常见的queue操作:
1.在队列末尾插入元素的push函数(通过调用底层容器的push_back函数实现)
2.在队列前面删除元素的pop函数(通过调用底层容器的pop_back函数实现)
3.获取队列中第一个元素的引用的front函数(通过调用底层容器的front函数实现)
4.获取队列最后一个元素的引用的back(通过调用底层容器的back函数实现)
5.判断队列是否为空的empty函数(通过调用底层容器的empty函数实现)
6.获取队列元素数量的size函数(通过调用底层容器的size函数实现)
为了获得最佳性能,应使用deque类作为queue的底层容器
常用函数,参考连接:http://www.howsoftworks.net/cplusplus.api/std/indexqueue.html
示例代码:
int _tmain(int argc, _TCHAR* argv[])
{
//queue<int> dequeQueue;//queue适配器:默认为deque实现
//dequeQueue.push(2);
//dequeQueue.push(2344);
//dequeQueue.push(19);
//cout <<"last elem:" <<dequeQueue.back() << endl;
//cout <<"first elem:" << dequeQueue.front() << endl;
//dequeQueue.pop();
//cout << "After pop..." << endl;
//cout << "last elem:" << dequeQueue.back() << endl;
//cout << "first elem:" << dequeQueue.front() << endl;
list<int> listint = { 2, 223, 2545, 656, 6568878 };
queue<int, list<int>> listQueue(listint);//queue适配器:list实现
listQueue.push(2);
listQueue.push(2344);
listQueue.push(19);
cout << "last elem:" << listQueue.back() << endl;
cout << "first elem:" << listQueue.front() << endl;
listQueue.pop();
cout << "After pop..." << endl;
cout << "last elem:" << listQueue.back() << endl;
cout << "first elem:" << listQueue.front() << endl;
return 0;
}
3.priority_queue
容器接口类,提供对其他容器的包装接口,提供对底层容器的top元素的有限制访问。
priority_queue类,能够按照有序的方式在底层数据结构中执行插入操作,也能从底层数据结构的前面执行删除操作。
priority_queue能够用STL的序列容器vector和deque实现。默认情况下使用vector作为底层容器的。当元素添加到priority_queue时,它们按优先级顺序插入。
这样,具有最高优先级的元素,就是从priority_queue中首先被删除的元素。通常这是利用堆排序来实现的。
堆排序总是将最大值(即优先级最高的元素)放在数据结构的前面。这种数据结构称为(heap)
默认情况下,元素的比较是通过比较器函数对象less<T>执行的。
priority_queue具有几个常见的操作:
1.根据priority_queue的优先级顺序在适当位置插入push函数(通过调用底层容器的push_back,然后使用堆排序为元素重新排序)
2.删除priority_queue的最高优先级元素的pop(删除堆顶元素之后通过调用底层容器的pop_back实现)
3.获取priority_queue的顶部元素引用的top函数(通过调用底层容器的front函数实现)
4.判断priority_queue是否为空的empty函数(通过调用底层容器的empty函数实现)
5.获取priority_queue元素数量的size函数(通过调用底层容器的size函数实现)
为了获取最佳性能,使用vector作为priority_queue的底层容器
常用函数,参考连接:http://www.howsoftworks.net/cplusplus.api/std/indexpriority_queue.html
示例代码:
int _tmain(int argc, _TCHAR* argv[])
{
priority_queue<int> listPriorityQueue;//queue适配器:默认vector实现,默认降序排序(优先级高的在前面)
listPriorityQueue.push(2);
listPriorityQueue.push(2344);
listPriorityQueue.push(19);
cout << listPriorityQueue.top() << endl;//输出优先级最高的值
listPriorityQueue.pop();
cout << "After pop..." << endl;
cout << listPriorityQueue.top() << endl;
return 0;
}