C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

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适配器要求提供随机訪问功能,因此可建立在vector或 deque容器上,但不能建立在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();
    }
}

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






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4754854.html,如需转载请自行联系原作者


相关文章
|
4天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
2月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
108 5
|
2月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
42 0
|
3月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
69 2
|
3月前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
39 2
|
3月前
|
存储 算法 搜索推荐
对二叉堆的简单分析,c和c++的简单实现
这篇文章提供了对二叉堆数据结构的简单分析,并展示了如何在C和C++中实现最小堆,包括初始化、插入元素、删除最小元素和打印堆的函数,以及一个示例程序来演示这些操作。
45 19
|
3月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【10月更文挑战第8天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
3月前
|
存储 编译器 C语言
C++类与对象深度解析(一):从抽象到实践的全面入门指南
C++类与对象深度解析(一):从抽象到实践的全面入门指南
58 8
|
3月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
76 5
|
3月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
85 2