STL标准库(四) 容器适配器

本文详细介绍了C++中适配器的作用,包括将不同接口的类转换为统一接口,以及栈、队列和优先队列的原理、应用方法和容器类型。特别强调了适配器不仅仅是兼容,还可能存在限制。通过示例展示了栈、队列的基本操作和优先队列的自定义排序功能。
摘要由CSDN通过智能技术生成

适配器:将功能类似但接口不同的类转换为另一个统一的接口,类似转换器

常见适配器分为以下三种:

stack 栈 包含头文件<stack>

queue 队列

priority_queue 优先队列

如下是一些栈的应用方法:

obj.push();push_back()

obj.pop(); pop_back()

obj.top()back();

如上应用方法,同样支持的迭代器:vector list deque

以上三种迭代器具有相同的功能,可以使用同一种适配器

但适配器不单单是兼容,可能还是限制

比如vector vec; vec[2] 可以支持数组[]的方式,但是如果使用栈适配器 ,就不能使用该功能

如下一个程序进行演示:

int main()

{

    std::cout << typeid(std::stack<int>::container_type).name() << std::endl;

打印栈容器类型发现是class std::deque<int,class std::allocator<int> >,是默认以class _Container = deque<_Ty>容器实现

    std::stack<int> obj; 声明一个栈

栈是一个先进后出,单端操作的结构

    std::stack<int, vector<int>>obj; 指定栈内部使用vector,不可使用其他不支持类型,但声明并调用该其他类型自己的方法是没有错误的

    for (si ze_t i = 0; i < 5; i++)

    {

       obj.push(i); 依次弹入值

    }

    std::cout << obj.size() << std::endl;

    for (size_t i = 0; i < 5; i++)

    {

       std::cout << obj.top() << std::endl; 依次打印该栈元素值

       obj.pop(); 依次弹出

    }

    if (obj.empty())

    {

       std::cout << "empty" << std::endl;

    }

    std::cout << obj.size() << std::endl;  获取容器元素个数

    system("pause");

    return 0;

}

队列

队列特性:尾进头出

以下是队列所拥有的方法:

obj.push(); push_back();

obj.pop(); pop_front();

obj.front();front()

obj.back();back()

支持以上方法的容器: deque list

如下一个程序进行演示:

#include <queue> 包含头文件

int main()

{

    std::queue<int> obj; 默认以class _Container = deque<_Ty>容器实现

    for (size_t i = 0; i < 5; i++) 循环元素入列

    {

       obj.push(i);

    }

    std::cout << "size:" << obj.size() << std::endl; 打印元素总数

    while (!obj.empty()) 另一种方式的循环打印

    {

       std::cout << obj.front() << std::endl; 打印头元素

       obj.pop(); 弹出头元素

    }

    std::cout << "size:" << obj.size() << std::endl;

    system("pause");

    return 0;

}

优先队列

优先队列:属于队列的一种,默认下,自动排序元素,以vector为容器,内部使用堆排进行排序

#include <queue> 包含头文件

int main()

{

std::priority_queue<int,std::vector<int>,std::greater<int>> obj;

greater<int> 小的在前面,大的在后面,小的的先出队

less<int> 大的在前面,小的在后面,大的的先出队

    obj.push(10);

    obj.push(2);

    obj.push(100);

    obj.push(55);

    obj.push(77);

    while (!obj.empty()) 进行测试是否从小到大进行排序的

    {

       std::cout << obj.top() << std::endl; 打印头元素

       obj.pop(); 弹出头元素

    }打印结果2 10 55 77 100

    system("pause");

    return 0;

}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值