2021年11月15日 C++ STL库 deque&&stack

本文详细介绍了C++标准库中的两种容器:deque(双端队列)和stack(栈)。deque允许在两端进行插入和删除操作,提供了灵活的数据管理方式,包括构造、赋值、大小操作及插入删除等方法。stack则是一种后进先出(LIFO)的数据结构,主要操作包括构造、赋值、数据存取和大小查询。理解这两个容器对于C++编程至关重要。

deque

 

 创建deque

deque<T> deqT; "默认构造形式"

deque(beg, end);  "构造函数将[beg, end)区间中的元素拷贝给本身(beg和end都是deque的迭代器"

deque(n, elem); "构造函数将n个elem拷贝给本身"

deque(const deque &deq); "拷贝构造函数"

deque赋值 

d2 = d1; "直接赋值"

d3.assign(d1.begin(), d1.end());

d4.assign(10, 100);

 deque大小操作

deque.empty(); "判断容器是否为空"
deque.size(); "返回容器中元素的个数"
deque.resize(num); "重新指定容器的长度为num,若容器变长,则以默认值填充新位置。"
                   "如果容器变短,则末尾超出容器长度的元素被删除。"
deque.resize(num, elem); "重新指定容器的长度为num,若容器变长,则以elem值填充新位置。"
                         "如果容器变短,则末尾超出容器长度的元素被删除。"

deque 插入和删除

首尾插入 

push_back(elem);  "在容器尾部添加一个数据"

push_front(elem);  "在容器头部插入一个数据"

pop_back();  "删除容器最后一个数据"

pop_front(); "删除容器第一个数据"

指定位置

insert(pos,elem);  "在pos位置插入一个elem元素的拷贝,返回新数据的位置。"

insert(pos,n,elem);  "在pos位置插入n个elem数据,无返回值。"

insert(pos,beg,end);  "在pos位置插入[beg,end)区间的数据,无返回值。"

clear();  "清空容器的所有数据"

erase(beg,end); "删除[beg,end)区间的数据,返回下一个数据的位置。"

erase(pos); "删除pos位置的数据,返回下一个数据的位置。"

 小结:erase和pop区别


 deque数据的读取

at(int idx); "返回索引idx所指的数据"

[]; "返回索引idx所指的数据"

front(); "返回容器中第一个数据元素"

back(); "返回容器中最后一个数据元素"

stack 

构造函数:
stack<T> stk;           "stack采用模板类实现, stack对象的默认构造形式"
stack(const stack &stk);  "拷贝构造函数"

赋值操作:
stack& operator=(const stack &stk); "重载等号操作符"

数据存取:
push(elem); "向栈顶添加元素"
pop();  "从栈顶移除第一个元素"
top();  "返回栈顶元素"

大小操作:
empty();  "判断堆栈是否为空"
size();  "返回栈的大小"

C++ STL中,不同容器具有各自独特的特点和适用场景,同时它们也共享一些通用的方法。以下是对 `vector`、`deque`、`stack`、`queue`、`list`、`set` 和 `map` 容器的常用方法总结,并通过表格进行对比分析。 ### 通用方法总结 这些容器共享一些通用的方法,例如: - `size()`:返回容器中元素的数量。 - `empty()`:检查容器是否为空。 - `begin()` 和 `end()`:返回指向容器首元素和尾后位置的迭代器。 - `clear()`:清空容器中的所有元素。 - `operator=`:用于赋值操作。 以下是一些容器特定的方法和功能。 ### 容器方法对比表格 | 容器类型 | 插入方法 | 删除方法 | 访问元素 | 排序支持 | 其他特性 | |----------|----------|----------|----------|-----------|----------| | **vector** | `push_back()`, `insert()` | `pop_back()`, `erase()` | `operator[]`, `at()`, `front()`, `back()` | 支持(通过 `sort()`) | 动态数组,随机访问高效 | | **deque** | `push_back()`, `push_front()`, `insert()` | `pop_back()`, `pop_front()`, `erase()` | `operator[]`, `at()`, `front()`, `back()` | 支持(通过 `sort()`) | 双端队列,头尾插入/删除高效 | | **stack** | `push()` | `pop()` | `top()` | 不支持 | 后进先出(LIFO)结构 | | **queue** | `push()` | `pop()` | `front()`, `back()` | 不支持 | 先进先出(FIFO)结构 | | **list** | `push_back()`, `push_front()`, `insert()` | `pop_back()`, `pop_front()`, `erase()`, `remove()` | 不支持随机访问 | 支持(通过 `sort()` 成员函数) | 双向链表,频繁插入/删除高效 | | **set** | `insert()` | `erase()` | 通过迭代器访问 | 不支持(自动排序) | 基于红黑树,元素唯一且有序 | | **map** | `insert()`, `operator[]` | `erase()` | `at()`, `operator[]` | 不支持(自动按键排序) | 键值对存储,键唯一且有序 | ### 详细说明 - **vector** 提供了高效的随机访问功能,适合需要频繁访问元素的场景。插入和删除操作在尾部效率较高,但在中间或头部操作时性能较差 [^3]。 - **deque** 与 `vector` 类似,但支持高效的头部和尾部插入/删除操作,适合实现双端队列或需要频繁在两端操作的场景 [^2]。 - **stack** 和 **queue** 是容器适配器,通常基于 `deque` 实现。`stack` 用于后进先出(LIFO)场景,而 `queue` 适用于先进先出(FIFO)场景 [^1]。 - **list** 是双向链表,插入和删除操作效率高,但不支持随机访问。适合需要频繁插入/删除的场景,如动态数据管理 [^3]。 - **set** 和 **map** 基于红黑树实现,元素或键值自动排序。`set` 用于存储唯一且有序的元素集合,而 `map` 用于存储键值对并提供高效的查找功能 [^2]。 ### 示例代码 以下是一个简单的示例,展示如何使用 `vector` 和 `list` 的排序功能: ```cpp #include <iostream> #include <vector> #include <list> #include <algorithm> int main() { // 使用 vector 排序 std::vector<int> vec = {5, 3, 8, 1, 2}; std::sort(vec.begin(), vec.end()); std::cout << "Vector 排序后: "; for (int i : vec) std::cout << i << " "; std::cout << std::endl; // 使用 list 排序 std::list<int> lst = {5, 3, 8, 1, 2}; lst.sort(); // 使用 list 自带的排序方法 std::cout << "List 排序后: "; for (int i : lst) std::cout << i << " "; std::cout << std::endl; return 0; } ``` ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值