STL容器适配器

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只能访问队头的元素。

上一篇:3D打印步骤


下一篇:C++初阶---STL入门+(string)