首页 > 其他 > 详细

容器适配器

时间:2020-03-15 15:19:06      阅读:72      评论:0      收藏:0      [点我收藏+]

除了顺序容器外,标准库还定义了三个顺序容器适配器:stackqueuepriority_queue

适配器是标准库中的一个通用概念,容器、迭代器和函数都有适配器。本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。
技术分享图片

定义一个适配器

每个适配器都定义两个构造函数:

  • 默认的构造函数创建一个空的对象。
  • 接受一个容器的构造函数拷贝该容器来初始化适配器。

默认情况下,stackqueue 是基于 deque 实现的,priority_queue 是在 vector 之上实现的。

可以在创建一个适配器时将一个命名的顺序容器作为第二个参数来重载默认容器类型。

//在vector上实现的空栈
stack<string, vector<string>> str_stk;
//str_stk2在vector上实现,初始化时保存svec的拷贝
stack<string, vector<string>> str_stk2(svec);

对于一个给定的适配器,可以使用哪些容器是有限制的。

  • 所有容器都要有添加和删除元素的能力,因此,适配器不能构建在 array 之上。类似的,也不能用 forward_list 来构造容器适配器,因为所有适配器都要求容器具有添加、删除以及访问尾元素的能力。
  • stack 只要求 push_backpop_backback 操作,因此可以使用除 arrayforward_list 之外的任何容器类型来构造。
  • queue 要求 backpush_backfrontpush_front,因此它可以构建在 listdeque 之上,但不能基于 vector 构造。
  • priority_queue 除了 frontpush_backpop_back 操作之外还要求随机访问能力,因此可以构造于vectorqueue 之上,但不能基于 list 构造。

每个容器适配器都基于底层容器类型的操作定义自己的特殊操作,使用时只可以使用适配器操作,而不能使用底层容器类型的操作。

栈适配器

stack 类型定义在 stack 头文件中。
技术分享图片

stack<int> intStack;
for (size_t ix = 0; ix != 10; ++ix)
intStack.push(ix);

while (!intStack.empty())
{
    int value = intStack.top();
    intStack.pop(); 
}

队列适配器

queuepriority_queue 适配器定义在 queue 头文件中。
技术分享图片
技术分享图片

priority_queue 允许在队列中的元素创立优先级。新加入的元素会安排在所有优先级比它低的已有元素之前。默认情况下,标准库在元素类型上使用 < 运算符来确定相对优先级。

容器适配器

原文:https://www.cnblogs.com/xiaojianliu/p/12497252.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!