助记队列(queue)、栈(stack)和unordered_map以及的用法总结

由于queuestack在c++中的函数大差不差,但是仍有一些差别,为了准确记忆,于是有了这篇blog
顺便对比了unordered_map

数据结构初始化方式常用函数说明
队列 (queue)#include <queue>
std::queue<int> q; queue<TreeNode*> q
q.push(x):将元素x加入队列尾部
q.pop():移除队列头部元素
q.front():返回队列头部元素
q.back():返回队列尾部元素
q.empty():判断队列是否为空
q.size():返回队列中元素的数量
队列是FIFO(先进先出)的数据结构,只能在队尾插入,队头删除。
栈 (stack)#include <stack>
std::stack<int> s;
s.push(x):将元素x压入栈顶
s.pop():移除栈顶元素
s.top():返回栈顶元素
s.empty():判断栈是否为空
s.size():返回栈中元素的数量
栈是LIFO(后进先出)的数据结构,只能在栈顶插入和删除。
unordered_map#include <unordered_map>
std::unordered_map<std::string, int> umap;
umap[key] = value:插入或更新键值对
umap.insert({key, value}):插入键值对
umap.find(key):查找键,返回迭代器
umap.erase(key):删除键值对
umap.empty():判断是否为空
umap.size():返回键值对数量
umap.count(key):返回键是否存在(0或1)
unordered_map是基于哈希表的关联容器,键值对无序存储,查找效率为O(1)。

示例代码

队列 (queue)
#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;
    q.push(10);  // 队列: [10]
    q.push(20);  // 队列: [10, 20]
    q.push(30);  // 队列: [10, 20, 30]

    std::cout << "Front: " << q.front() << std::endl;  // 输出: 10
    std::cout << "Back: " << q.back() << std::endl;    // 输出: 30

    q.pop();  // 队列: [20, 30]
    std::cout << "Size: " << q.size() << std::endl;  // 输出: 2
    return 0;
}
栈 (stack)
#include <iostream>
#include <stack>

int main() {
    std::stack<int> s;
    s.push(10);  // 栈: [10]
    s.push(20);  // 栈: [10, 20]
    s.push(30);  // 栈: [10, 20, 30]

    std::cout << "Top: " << s.top() << std::endl;  // 输出: 30

    s.pop();  // 栈: [10, 20]
    std::cout << "Size: " << s.size() << std::endl;  // 输出: 2
    return 0;
}
unordered_map
#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> umap;
    umap["apple"] = 5;  // 插入键值对
    umap["banana"] = 3;

    umap.insert({"orange", 2});  // 另一种插入方式

    if (umap.find("banana") != umap.end()) {
        std::cout << "Banana count: " << umap["banana"] << std::endl;  // 输出: 3
    }

    std::cout << "Size: " << umap.size() << std::endl;  // 输出: 3
    return 0;
}
### 特点与用途总结 #### `vector` `vector` 是一个动态数组,支持随机访问迭代器,可以在尾部高效地添加或删除元素。由于其内部结构是连续存储的,因此在中间或头部插入/删除元素会导致大量元素移动[^3]。 ```cpp std::vector<int> v; v.push_back(1); // 尾部添加元素 v.pop_back(); // 尾部删除元素 ``` #### `list` `list` 是一个双向链表,支持常数时间内在任意位置插入删除元素。不支持随机访问,只能通过迭代器进行顺序访问。适用于频繁插入/删除操作的场景[^2]。 ```cpp std::list<int> l; l.push_back(1); // 尾部添加元素 l.push_front(0); // 头部添加元素 l.pop_back(); // 尾部删除元素 l.pop_front(); // 头部删除元素 ``` #### `deque` `deque` 是一个双端队列,支持在头部尾部高效地插入删除元素。内部结构由中控器管理的分段连续空间组成,允许快速随机访问[^2]。 ```cpp std::deque<int> dq; dq.push_back(1); // 尾部添加元素 dq.push_front(0); // 头部添加元素 dq.pop_back(); // 尾部删除元素 dq.pop_front(); // 头部删除元素 ``` #### `queue` `queue` 是一个先进先出(FIFO)的数据结构,默认基于 `deque` 实现。提供 `push` `pop` 方法来操作元素[^1]。 ```cpp std::queue<int> q; q.push(1); // 添加元素 q.pop(); // 删除元素 ``` #### `stack` `stack` 是一个后进先出(LIFO)的数据结构,默认基于 `deque` 实现。提供 `push` `pop` 方法来操作元素[^1]。 ```cpp std::stack<int> s; s.push(1); // 添加元素 s.pop(); // 删除元素 ``` #### `set` `set` 是一个有序集合,默认基于红黑树实现。所有元素都是唯一的,并且按照特定顺序存储[^1]。 ```cpp std::set<int> st; st.insert(1); // 插入元素 st.erase(1); // 删除元素 ``` #### `map` `map` 是一个有序键值对容器,默认基于红黑树实现。每个键都是唯一的,并且按照特定顺序存储。 ```cpp std::map<std::string, int> m; m["one"] = 1; // 插入键值对 m.erase("one"); // 删除键值对 ``` ### 选择建议 - 如果需要随机访问并且尾部操作较多,使用 `vector`。 - 如果需要频繁在任意位置插入/删除元素,使用 `list`。 - 如果需要高效的头部尾部操作,使用 `deque`。 - 如果需要实现队列行为,使用 `queue`。 - 如果需要实现行为,使用 `stack`。 - 如果需要保持元素唯一并按顺序存储,使用 `set`。 - 如果需要保持键值对唯一并按顺序存储,使用 `map`。 ### 相关问题 1. C++ STL 中 `unordered_set` `unordered_map` 的特点是什么? 2. 如何在 C++ STL 中选择合适的数据结构? 3. C++ STL 中 `vector` `deque` 的性能差异是什么? 4. C++ STL 中 `list` `forward_list` 的区别是什么? 5. C++ STL 中 `set` `multiset` 的区别是什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flyee-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值