ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STL容器适配器

2021-10-26 23:02:30  阅读:167  来源: 互联网

标签:容器 STL 适配器 元素 queue priority stack


1 介绍

通过封装某个序列容器,根据实际的应用场景对成员函数进行组合调用,以满足特定的需求。

2 适配器种类

表2.1 STL容器适配器

容器适配器基础容器需要包含的成员函数可使用的基础容器

stack 

(栈适配器

后进先出)

  • empty()
  • size()
  • back()
  • push_back()
  • pop_back()

deque(默认)

vector

list

queue

(队列适配器

先进先出)

  • empty()
  • size()
  • back()
  • front()
  • push_back()
  • pop_front()

deque(默认)

list

priority_queue

(最大元素在队列最前)

  • empty()
  • size()
  • front()
  • push_back()
  • pop_back()

vector(默认)

deque

3 stack容器适配器

栈,数据的存取只能够从栈顶处进行操作。

3.1 模板类

stack<T,Container=deque<T>>              // T:存储元素的类型;Conainer:底层容器类型。

3.2 创建方式

  1. stack<dataType> name;         // 创建一个底层为deque容器的stack适配器。
  2. stack<dataType1,  containerType<dataType2>>       // 创建一个空的stack适配器,自定义底层容器,如果dataType1和dataType2不是同一种数据类型,stack底层将默认使用deque容器。
  3. 使用基础容器初始化stack适配器。
  4. 使用另一个适配器初始化适配器。

示例:

#include <iostream>
#include <stack>
#include <list>
#include <vector>
using namespace std;
int main()
{
	// 1 创建空的适配器
	stack<int> s1;
	
	// 2 修改底层容器并创建空的适配器
    stack<string, list<int>> s2;
	
	// 3 使用基础容器初始化适配器
	list<int> l1{1, 2, 3};
	vector<int> v1{4, 5, 6};
	stack<int, list<int>> s3;
	stack<int, vector<int>> s4;
	
	// 4 使用其他stack初始化适配器
	// 方式1
	stack<int, list<int>> s5 = s3;
	// 方式2
	stack<int, vector<int>> s6 = s4;
		
    return 0;
}

3.3 成员方法

表 3.1 stack适配器支持的成员方法

成员函数功能
empty()当 stack 栈中没有元素时,该成员函数返回 true;反之,返回 false。
size()返回 stack 栈中存储元素的个数。
top()返回一个栈顶元素的引用,类型为 T&。如果栈为空,程序会报错。
push(const T& val)先复制 val,再将 val 副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
push(T&& val)以移动元素的方式将其压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
pop()弹出栈顶元素。
emplace(arg...)arg... 可以是一个参数,也可以是多个参数,但它们都只用于构造一个对象,并在栈顶直接生成该对象,作为新的栈顶元素。
swap(stack<T> & other_stack)将两个 stack 适配器中的元素进行互换,需要注意的是,进行互换的 2 个 stack 适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。

 4 queue容器

4.1 介绍

先进先出

模板类:

queue<T,Container=deque<T>>  

 4.2 创建方式

  1. queue<dataType> name;         // 创建一个底层为deque容器的queue适配器。
  2. queue<dataType1,  containerType<dataType2>>       // 创建一个空的queue适配器,自定义底层容器。
  3. 使用基础容器初始化queue适配器。
  4. 使用另一个适配器初始化适配器。

操作同stack适配器相同。且底层容器可选择deque(默认)、list

 4.3 成员方法

表4.1 deque的成员方法

成员函数功能
empty()如果 queue 中没有元素的话,返回 true,否则返回false。
size()返回 queue 中元素的个数。
front()返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back()返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj)在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
push(T&& obj)以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
emplace() 在 queue 的尾部直接添加一个元素。
pop()删除 queue 中的第一个元素。
swap(queue<T> &other_queue)将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。

5 priority_queue

5.1 介绍

优先级最大的元素先出列。(优先级根据排序规则评判)

队头总是优先级最大的元素,但队列并不一定时按优先级进行了排序???

模板类:

template <typename T,

        typename Container=std::vector<T>,

        typename Compare=std::less<T> >

        class priority_queue{

        //......

}

5.2 创建方式

  1. priority_queue<int> name;        // 创建一个空的priority_queue 适配器。
  2.  使用基础容器或者数组初始化queue适配器。

示例:

//方式1 使用普通数组
int a1[]{1,2,3,4};
std::priority_queue<int> q1(a1, a1+4);//{1,2,3,4}

//方式2 使用序列式容器
std::array<int,3>values{1,2,3};
std::priority_queue<int>q1(values.begin(),values.end());//{1,2,3}

5.3 排序规则(优先级判别)

  1. std::less<T>            // 从大到小(默认)
  2. std::greater<T>       // 从小到大
  3. 自定义

示例:

priority_queue<int, std::deque<int>, std::greater<int> > q1;    // 从大到小

 5.4 成员方法

表5.1 priority_queue的成员方法

成员函数功能
empty()如果 priority_queue 为空的话,返回 true;反之,返回 false。
size()返回 priority_queue 中存储元素的个数。
top()返回 priority_queue 中第一个元素的引用形式。
push(const T& obj)根据既定的排序规则,将元素 obj 的副本存储到 priority_queue 中适当的位置。
push(T&& obj)根据既定的排序规则,将元素 obj 移动存储到 priority_queue 中适当的位置。
emplace(Args&&... args)Args&&... args 表示构造一个存储类型的元素所需要的数据(对于类对象来说,可能需要多个数据构造出一个对象)。此函数的功能是根据既定的排序规则,在容器适配器适当的位置直接生成该新元素。
pop()移除 priority_queue 容器适配器中第一个元素。
swap(priority_queue<T>& other)将两个 priority_queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 priority_queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。

 stack只能访问栈顶的元素,queue可以访问队列头和尾部的元素,priority_queue只能访问队头的元素。

标签:容器,STL,适配器,元素,queue,priority,stack
来源: https://blog.csdn.net/weixin_42542290/article/details/120981747

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有