容器适配器 :
三种顺序 容器适配器:queue, priority_queue 和 stack
适配器 是 使某一个事物的行为类似 于另外一个事物的行为的一种机制。 STL 适配器分为 函数对象适配器、迭代器适配器 和 容器适配器 3种,分别完成对应的类型转换。这个概念太抽象了,那么 具体到生活中的实例 如何理解呢,查看一下网上的资料得出:
容器适配器就是封装一个容器使其具有全新的外观 .容器适配器:包括栈(stack)、队列(queue)、优先(priority_queue)。使用容器适配器,stack就可以被实现为基本容器类型(vector,dequeue,list)的适配。可以把stack看作是某种特殊的vctor,deque或者list容器,只是其操作仍然受到stack本身属性的限制。queue和priority_queue与之类似。容器适配器的接口更为简单,只是受限比一般容器要多; 其作用是 让一种已经存在的容器类型采用另外一种不同的抽象类型的工作方式实现。
适配器 定义了两种构造函数: 1)默认构造函数创建空对象, 2)带一个容器参数的构造函数 使用参数容器副本 作为其基础值
//默认的stack 和 queue 通过deque容器实现的 priority_queue 是在vector上实现的
在创建适配器的时候,可以提供一个顺序容器制定为适配器的第二个类型参数,可以覆盖默认关联基础容器类型,对于给定适配器,其关联容器必须满足约束条件
1) stack 适配器 可以关联任意 一个 顺序容器来型 2)queue 适配器 必须要求其关联的容器提供push_front操作 ,因此 能建立在list和deque,不能建立在vector,因为vector不提供 这个操作
3) priority_queue适配器 要求提供随机访问功能。则不能建立在list 上
栈的操作:
int main()
{
const stack< int >::size_type stk_size = 10;
stack< int > intStack;
int ix = 0;
while( intStack.size() != stk_size ) //size()操作返回栈中元素的个数
{
intStack.push( ix++ ); //将元素 压入到栈内
}
int error_cnt = 0;
while( intStack.empty() == false ) //empty() 如果栈为空 则返回真,否则 则返回假
{
int value = intStack.top(); // top 返回 栈顶元素的值
cout << value << " ";
if( value != --ix )
{
cerr << "oops! expected " << ix << "received " << value << endl;
++error_cnt;
}
intStack.pop(); //将栈顶元素出栈
}
cout << endl;
cout << "Our program ran with " << error_cnt << " errors" << endl;
return 0;
}
所有的容器适配器 都根据其基础类型容器类型所直至的操作来定义自己的操作,默认的情况下 stack适配器 是建立在 deque上,所以 由deque的提供的操作来实现栈功能。
so stack中的push操作 是由 deque中的 push _back 提供。但是不能直接在栈上 直接调用 push_back操作,因为 封装起来的,给外面提供的 只有push()操作。
队列queue的操作
//默认的queue 和 queue 通过deque容器实现的 priority_queue 是在vector上实现的
int main()
{
const queue< int >::size_type stk_size = 10;
queue< int > intQueue;
int ix = 0;
while( intQueue.size() != stk_size ) //size()操作返回队列中元素的个数
{
intQueue.push( ix++ ); //将元素 压入到队列内,在队尾操作
int valueFront = intQueue.front();
int valueEnd = intQueue.back();
cout << valueFront << " " << valueEnd << endl;
}
int error_cnt = 0;
ix = 0;
while( intQueue.empty() == false ) //empty() 如果栈为空 则返回真,否则 则返回假
{
int value = intQueue.front(); // top 返回 栈顶元素的值
cout << value << " ";
if( value != ix++ )
{
cerr << "oops! expected " << ix << "received " << value << endl;
++error_cnt;
}
intQueue.pop(); //将栈顶元素出栈
}
cout << endl;
cout << "Our program ran with " << error_cnt << " errors" << endl;
return 0;
}