【C++】STL容器适配器使用总结

it2026-06-13  7

目录

1. 容器适配器2. 三种容器适配器简单介绍2.1 容器适配器的使用2.1.1创建适配器2.1.2常用函数

1. 容器适配器

容器适配器是封装了序列式容器的类模板,在一般容器的基础上提供来了一些不同的功能,通过适配容器现有的接口提供不同的功能。 STL的容器适配器有stack、queue、priority_queue三种,都是在序列式容器的基础上实现的,屏蔽了顺序容器的一部分功能,突出或增加了另外一些功能。

容器适配器没有迭代器,STL中的各种查找、排序等算法都不适用于容器适配器。

2. 三种容器适配器简单介绍

STL提供三种容器适配器:栈-stack、队列-queue、优先级队列-priority_queue。

容器适配器基础容器筛选条件默认使用的基础容器stack栈,先进后出 First-In-Last-Out基础容器需包含以下成员函数: empty()size()front()push_back()pop_back()满足条件得基础容器有vector、deque、listdequequeue栈,先进先出 First-In-First-Out基础容器需包含以下成员函数: empty()size()frontback()push_back()pop_back()满足条件得基础容器有vector、deque、listdequepriority_queue优先级队列基础容器需包含以下成员函数: empty()size()front()push_back()pop_back()满足条件得基础容器有vector、deque、listvector

对priority_queue来说,元素的存取是优先级最大的元素最先出队列,比如,当priority_queue指定的排序规则是按照元素的从小到大值排序的,即降序排序,那么该优先级队列的元素中值最大的优先级最高。

三种适配器模板类定义如下:

template <class T,class Container = deque<T> > class stack; template <class T,class Container = deque<T> > class queue; template <class T,class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue;

2.1 容器适配器的使用

类模板栈stack定义在头文件< stack>中; 队列queue和优先级队列都定义在头文件< queue>中; 三种适配器都在名空间std中。 所以使用时需要添加对应的头文件和名空间。

2.1.1创建适配器

创建空的适配器,使用默认的基础容器,priority_queue排序方式使用默认的std::less< T>方法。 创建栈stack: std::stack<int> mystack; 创建队列queue: std::queue<int> myqueue; 创建priority_queue: std::priority_queue<int> mypriority_queue; 手动指定基础历容器的类型,priority_queue手动指定排序规则。 创建栈stack:std::stack<int, std::list<int> > mystack; 创建队列queue:std::queue<int, std::list<int>> myqueue; 创建priority_queue:std::priority_queue<int, std::deque<int>, std::greater<int>> mypriority_queue; 使用基础容器初始化stack和queue,需要保证使用的而基础容器与适配器指定的容器类型相同; 使用普通数组或其他容器中指定范围内的数据对priority_queue初始化,需要保证容器或数组中存储的元素类型和priority_queue指定的存储类型相同。 int arr[] = {2,4,5,6,7,9}; std::list<int> mylist{1,2,3,4,5}; 创建栈stack:std::stack<int ,std::list<int> > mystack(++mylist.begin(),mylist.end()); 创建队列queue:std::queue<int,std::list<int> > myqueue(++mylist.begin(),mylist.end()); 创建priority_queue:std::priority_queue<int, ,std::list<int> > mypriority_queue)(arr,arr+3); 创建priority_queue:std::priority_queue<int, ,std::list<int> > mypriority_queue)(++mylist.begin(),mylist.end()); 用另一个适配器初始化新的适配器,只要存储的元素类型及底层采用的基础容器类型相同。 std::stack<int> mystack(oldstack); std::queue<int> myqueue(oldqueue); std::priority_queue<int> mypriority_queue(oldpriority_queue);

2.1.2常用函数

STL为适配器提供了以下函数:

成员函数stackqueuepriority_queueempty()判断适配器是否为空同stack同stacksize()返回容器存储的元素的个数同stack同stacktop()返回栈顶元素的引用,如果栈为空,程序报错不支持该函数返回第一个元素的引用形式push(const T& val)先复制val,,再将val副本压入栈顶在队尾添加一个元素的副本根据排序规则将val的副本存储到priority_queue的适当位置push(T&& val)以移动元素的方式压入栈以移动的方式在队尾添加元素根据排序规则,将val移动存储到priority_queue适当位置pop()返回栈顶元素删除第一个元素同queueemplace()C++11新增,在栈顶直接生成一个元素在尾部直接添加一个元素根据排序规则,在适当位置直接生成该元素swap()C++11新增,将两个适配器中的元素互换同stack同stack STL为queue提供的访问元素的函数是 front()和back(),分别返回第一个元素和最后一个元素的引用,如果queue是常量,返回一个常引用,如果为空,返回值是未定义的。STL没有为适配器提供迭代器,访问元素的方式是遍历容器,不断移除访问过的元素,访问下一个元素。

部分函数使用示例,以优先级队列为例,stack和queue用法类似:

#include <iostream> #include <queue> using namespace std; int main(int argc, char *argv[]) { int arr[] = {1,2,3,4,5}; std::priority_queue<int> mypriority_queue(arr,arr+5); std::priority_queue<int,std::vector<int>,std::less<int> > copypriority(mypriority_queue); cout << copypriority.size() << endl; copypriority.emplace(10); copypriority.push(13); cout << copypriority.size() << endl; while (!copypriority.empty()) { cout << copypriority.top() << " "; copypriority.pop(); } cout << endl; return 0; }

返回结果: 5 7 13 10 5 4 3 2 1

stl参考手册容器部分 总结参考:http://c.biancheng.net/stl/container_adapters/

最新回复(0)