容器适配器之queue

转载http://blog.csdn.net/thefutureisour/article/details/7751846
容器适配器
容器适配器其实就是一个接口转换装置,使得我们能用特定的方法去操作一些我们本来无法操作的东西。举一个例子,比如你的一个设备支持串口线,而你的电脑支持的是USB接口,这时候我们没必要重新买一个支持USB的设备,只需要一根串口转USB口的小玩意儿,让你的设备能够连接到USB接口上,这就是适配器。
那么C++中的容器适配器是做什么的呢?可以做一个类比,我们已有的容器(如vector、list、deque)就是设备,这个设备支持的操作很多,比如插入、删除、迭代器访问等等。而我们希望这个容器表现出来的是栈的样子:先进后出,入栈出栈等等,此时,我们没有必要重写一个新的数据结构,而只需把原有的容器重新封装一下,改变它的接口,就能把它当做栈来用了。
言归正传,理解了什么是适配器以后,其实问题就很简单了。C++中定义了3种容器适配器,它们让容器提供的接口变成了我们常用的的3种数据结构:栈(先进后出)队列(先进先出)和优先级队列(按照优先级(“<”号)排序,而不是按照到来的顺序排序)。
至于具体是怎么变的,我们可以先了解一个大概:默认情况下,栈和队列都是基于deque实现的,而优先级队列则是基于vector实现的。当然,我们也可以指定自己的实现方式。但是由于数据结构的关系,我们也不能胡乱指定。栈的特点是后进先出,所以它关联的基本容器可以是任意一种顺序容器,因为这些容器类型结构都可以提供栈的操作要求,即它们都提供了push_back、pop_back和back操作。 队列queue的特点是先进先出,适配器要求其关联的基础容器必须提供pop_front操作,因此其不能建立在vector容器上;对于优先级队列,由于它要求支持随机访问的功能,所以可以建立在vector或者deque上,不能建立在list上。

参见http://www.cplusplus.com/reference/queue/queue/
template <class T, class Container = deque<T> > class queue;

FIFO queue
queues are a type of container adaptor, specifically designed to operate in a FIFO context (first-in first-out), where elements are inserted into one end of the container and extracted from the other.
[队列(queue)是一种容器适配器,具有先进先出(FIFO)的结构,元素从一端插入从另一端提取]
queues are implemented as containers adaptors, which are classes that use an encapsulated object of a specific container class as its underlying container, providing a specific set of member functions to access its elements. Elements are pushed into the "back" of the specific container and popped from its "front".
[容器适配器是一个类,这个类使用一个特定的容器类对象作为内在容器,该内在容器提供了一系列的成员函数来读取它的元素]
The underlying container may be one of the standard container class template or some other specifically designed container class. This underlying container shall support at least the following operations:
[队列的内在容器可以是一个标准容器类模板或者是其他专门设计的容器类,但无论如何,内在容器都应该至少支持以下几种操作:]
empty
size
front
back
push_back
pop_front
The standard container classes deque and list fulfill these requirements. By default, if no container class is specified for a particular queue class instantiation, the standard container deque is used.
[标准容器类deque和list满足这些要求。默认的内在容器是双向队列deque]

/*
//construct queue
queue(const container_type& ctnr = container_type())

ctnr
Container object.
[ctnr是一个容器类对象]
container_type is the type of the underlying container type (defined as an alias of the second class template parameter, Container; see member types).
[ctnr的数据类型container_type是内在容器的数据类型,即第二个模板参数Container]
*/

#include <iostream>
#include <deque>
#include <list>
#include <queue>

int main()
{
    std::deque<int> mydeck(3, 100);
    std::list<int> mylist(2, 200);

    std::queue<int> first;                              // empty queue with deque as underlying container
    std::queue<int> second(mydeck);                     // queue initialized to copy of deque with deque as underlying container

    std::queue<int, std::list<int>> third;              // empty queue with list as underlying container
    std::queue<int, std::list<int>> fourth(mylist);     // queue initialized to copy of list with list as underlying container

    std::cout << "size of first: " << first.size() << ‘\n‘;
    std::cout << "size of second: " << second.size() << ‘\n‘;
    std::cout << "size of third: " << third.size() << ‘\n‘;
    std::cout << "size of fourth: " << fourth.size() << ‘\n‘;

    system("pause");
    return 0;
}
/*
bool empty() const;
size_type size() const;
void push(const value_type& val);
void pop();
value_type& back();
value_type& front();
*/

#include <iostream>
#include <queue>

int main()
{
    std::queue<int> myque;

    for(int i=0; i<5; i++)
        myque.push(i*10);

    std::cout<<"myque contains: ";
    while(!myque.empty())
    {
        std::cout<<myque.front()<<‘ ‘;
        myque.pop();
    }

    std::cout<<‘\n‘;

    system("pause");
    return 0;
}
时间: 2024-10-05 23:50:02

容器适配器之queue的相关文章

容器适配器之priority_queue

template <class T, class Container = vector<T>,                class Compare = less<typename Container::value_type> > class priority_queue; Priority queuePriority queues are a type of container adaptors, specifically designed such that i

容器适配器之stack

参见http://www.cplusplus.com/reference/stack/stack/ template<class T, class Container = deque<T>> class stack;   LIFO stack   Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where e

Android适配器之DataModifyHelper数据操作类的封装

编写适配器代码时常常被以下几个问题所困扰: 1.业务层和适配器中对同一组数据进行维护,难以管理 2.在业务层针对数据进行修改后必须通知适配器更新,否则提示The content of the adapter has changed but ListView did not receive anotification 3.业务层修改数据时充斥大量的非空&数据标准化等冗余代码 针对前两个问题,可以将数据交由适配器去管理,业务层对数据的增删改查均通过适配器进行处理,这样仅需要维护好adapter中的数

函数对象适配器之ptr_fun的使用示例

1 //============================================================================ 2 // Name : CopyInts4.cpp 3 // Author : motein 4 // Version : 5 // Copyright : Your copyright notice 6 // Description : Hello World in C++, Ansi-style 7 //==============

c++STL容器之queue容器

队列:先进先出. 一.构造函数 queue<T> que; queue(const queue &que); 二.赋值操作 queue& operator=(const queue &que); 三.数据存取 push(ele); pop(); back(); front(); 四.大小操作 empty(); size(); 原文地址:https://www.cnblogs.com/xiximayou/p/12111651.html

STL容器适配器 stack, queue

stack是一种后进先出(last in first out)的数据结构.它只有一个出口,如图所示.stack允许新增元素,删除元素,取得最顶端元素.但除了最顶端外,没有其他任何地方可以存储stack的其他元素,换言之,stack不允许有遍历行为. 将元素推入stack的操作称为push, 将元素推出stack的操作称为pop. 为什么将stack称为适配器呢?我们先来看看适配器是怎么定义的.具有这种“修改某物接口,形成另一种风貌”之性质者,称为adapter(适配器).换言之,由于stack的

JDK容器与并发—Queue—Interface

框架概览 接口介绍 Queue 俗称队列,其设计目标是存储处理前的元素.在Collection基础上,新增了入队.出队.访问队首元素的方法: 1)Queue有两套功能相同的方法:add.remove.element分别为入队.出队.访问队首元素方法的抛出异常版本:offer.poll.peek则为返回特殊值的版本: 2)offer在有界队列中常用,当队列已满时,元素入队会返回false而不是抛出异常,因为这一般当作正常情况: 3)按照元素出入队顺序可分为:FIFO队列.LIFO队列.优先级队列,

Android适配器之定义PagerAdapter万能适配器

一般使用pageAdapter需要实现getcount.isViewFromObject.instantiateItem.destroyItem等默认函数,其实完全可以抽取共有代码到父类当中. /** * Created by Xiaoxuan948 on 2015/10/27. * Desc: * 提示:先给adapter设置数据,再绑定适配器 setAdapter会调用instantiateItem方法 */public class AbsUnityBasePageAdapter<T> e

关于ViewPager的适配器之——pagerAdapter加载缓存页面的机制

ViewPager有很多的适配器,如pagerAdapter,FragmentPagerAdapter等, 今天我想重点谈的是关于pagerAdapter加载缓存页面的机制的问题. 首先,使用pagerAdapter一般需要重写它的四个未实现的方法分别是: 1.  getCount(){} //得到总数 2.    //实例化页面,  相当于BaseAdapter等适配器中的 getView()方法 返回想要显示的对象(内容) // 不同之处是:这里需要把这些对象(内容)一一添加到adapter