zoukankan      html  css  js  c++  java
  • C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器

    STL实践与分析

    --容器适配器



    引:

    除了顺序容器。标准库还提供了三种顺序容器适配器:queue,priority_queuestack。适配器是标准库中的概念。包含容器适配器,迭代器适配器和函数适配器。

    适配器通用的操作和类型

    size_type

    一种类型,足以存储此适配器类型的最大对象长度

    value_type

    0

    container_type

    基础容器类型,适配器在此容器类型上实现

    Aa;

    创建一个空适配器,命名为a

    Aa(c);

    创建一个名为a的新适配器。初始化为c的副本

    关系操作符

    所有的适配器都支持所有关系操作符:==,!=,<,<=,>,>=


    1、使用适配器时,必须包括相关头文件:

    #include <stack>
    #include <queue>
    

    2、覆盖基础容器类型

        默认的queuestack都是基于deque实现,而priority_queue则再vector容器上实现,在创建适配器时,通过将一个顺序容器指定为适配器的第二个类型实參,可覆盖其关联的基础容器类型:

        stack<string> strStk;
        stack< string,vector<string> > str_stk;
        stack< string,vector<string> > str_stk2(strStk);    //Error
        stack< string,vector<string> > str_stk3(str_stk);   //OK
    

    stack适配器所关联的基础容器能够是随意一种顺序容器类型。

    因此,stack栈能够建立在vectorlist或者 deque容器之上。

    queue适配器要求其关联的基础容器必须提供push_front运算,因此仅仅能建立在list容器上,而不能建立在vector容器上。

    priority_queue适配器要求提供随机訪问功能,因此可建立在vectordeque容器上,但不能建立在list容器上。


    3、适配器的关系运算由当中的元素依次比較来实现


    一、栈适配器

    栈容器适配器支持的操作

    s.empty()

    假设栈为空。则返回true。否则返回false

    s.size()

    返回栈中元素的个数

    s.pop()

    删除栈顶元素,但不返回其值

    s.top()

    返回栈顶元素,但不删除该元素

    s.push(item)

    再栈顶压入元素

        const stack<int>::size_type stk_size = 10;
        stack<int> intStk;
    
        int ix = 0;
        while (intStk.size() != stk_size)
        {
            intStk.push(ix ++);
        }
    
        int err_cnt = 0;
        while (!intStk.empty())
        {
            int val = intStk.top();
            if (val != --ix)
            {
                cerr << "oops! expected " << ix
                     << " received " << val << endl;
                ++err_cnt;
            }
            intStk.pop();
        }
    
        cout << "Our Program ran with " << err_cnt << " errors!" << endl;
    

       默认情况下,栈适配器建立在deque容器上,因此採用deque提供的操作来实现栈功能

    比如,运行以下的语句:

        intStack.push(ix++);
    

    这个操作通过调用push_back操作实现,而该intStk所基于的 deque对象提供。

    虽然栈是以deque容器为基础实现的,可是程序猿不能直接訪问deque所提供的操作

    二、队列和优先级队列

    使用这两种队列,必须包括queue头文件。

    队列和优先级队列支持的操作

    q.empty()

    假设队列为空。则返回true,否则返回false

    q.size()

    返回队列中元素的个数

    q.pop()

    删除队首元素,但不返回其值

    q.front()

    返回队首元素,但不删除该元素

    该操作仅仅适用于队列

    q.back()

    返回对尾元素,但不删除该元素

    该操作仅仅适用于队列

    q.top()

    返回具有最高优先级的元素值,但不删除该元素

    该操作仅仅适用于优先级队列

    q.push(item)

    对于queue,在队尾插入一个新的元素。

    对于priority_queue,在基于优先级的适当位置插入新元素

        priority_queue同意用户为队列中存储的元素设置优先级

    这样的队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面标准库默认使用元素类型的<操作符来确定它们之间的优先级关系

    //P302 习题9.42
    int main()
    {
    //    freopen("input","r",stdin);
        stack<string> strStk;
        string val;
    
        while (cin >> val)
        {
            strStk.push(val);
        }
    
        while (!strStk.empty())
        {
            val = strStk.top();
            cout << val << endl;
            strStk.pop();
        }
    }
    

    //习题9.43
    int main()
    {
        freopen("input","r",stdin);
        stack<char> sexp;
        string exp;
        cin >> exp;
    
        string::iterator iter = exp.begin();
        while (iter != exp.end())
        {
            if (*iter != ')')
            {
                sexp.push(*iter);
            }
            else
            {
                while (!sexp.empty() && sexp.top() != '(')
                {
                    cout << sexp.top() << endl;
                    sexp.pop();
                }
                if (sexp.top() == '(')
                {
                    sexp.pop();
                    sexp.push('@');
                }
                else
                {
                    cerr << "No match ( !" << endl;
                    return 0;
                }
            }
            ++iter;
        }
    
        while (!sexp.empty())
        {
            cout << sexp.top() << endl;
            sexp.pop();
        }
    }

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    黄聪:手机移动端建站Jquery+CSS3+HTML5触屏滑动特效插件、实现触屏焦点图、图片轮展图
    黄聪:VS2010开发如何在c#中使用Ctrl、Alt、Tab等全局组合快捷键
    利用python实现汉字转拼音
    python 获得质数
    将你的python转成exe格式
    python 动画
    python 饼状图
    python 抓屏
    python 图像迷糊
    python-opencv-圆、椭圆与任意多边形的绘制
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4754854.html
Copyright © 2011-2022 走看看