C++容器的插入和删除操作
在 C++ 标准库中,push/pop 和 push_back/pop_back 的使用是根据容器的结构特性决定的 —— 序列式容器(如 vector、list)多用 push_back/pop_back(操作尾部),栈 / 队列等适配器多用 push/pop(适配底层逻辑)。下面我会清晰分类并解释原因,让你一眼就能分清。
一、详细分类表
| 容器类型 | 插入操作 | 删除操作 | 核心说明 |
|---|---|---|---|
|
|
|
|
动态数组,仅支持尾部高效操作,无 |
|
|
|
|
双端队列,支持头尾操作,无 |
|
|
|
|
双向链表,任意位置操作高效,无 |
|
|
|
|
单向链表,仅支持头部操作,无 |
|
|
|
|
本质是字符序列,尾部增删字符,无 |
|
|
|
|
栈(LIFO),适配 |
|
|
|
|
队列(FIFO),适配 |
|
|
|
|
优先队列,适配 |
|
|
无(用 |
无(用 |
红黑树结构,无 |
二、关键细节解释
1. 为什么序列式容器用 push_back/pop_back?
vector、list、deque 这类序列式容器的核心是「按顺序存储元素」,back 明确指向「尾部」,push_back 语义是「向尾部添加元素」,pop_back 是「从尾部删除元素」,符合直观的 “序列操作” 逻辑。
-
示例(vector):
#include <vector> #include <iostream> using namespace std; int main() { vector<int> vec; vec.push_back(1); // 尾部插入1,vec = [1] vec.push_back(2); // 尾部插入2,vec = [1,2] vec.pop_back(); // 尾部删除,vec = [1] cout << vec.back(); // 输出尾部元素:1 return 0; }
2. 为什么适配器(stack/queue)用 push/pop?
stack、queue 是容器适配器(底层封装了 deque/vector/list),它们的设计目标是「隐藏底层细节,只暴露符合自身特性的操作」:
-
stack是 “栈”,只需要 “入栈” 和 “出栈”,无需关心是操作头部还是尾部,因此用push(入栈)和pop(出栈); -
queue是 “队列”,只需要 “入队” 和 “出队”,同样用push(入队)和pop(出队); -
注意:
stack/queue没有push_back/pop_back,因为它们不允许直接操作底层容器的尾部。
示例(stack):
#include <stack>
#include <iostream>
using namespace std;
int main() {
stack<int> st;
st.push(1); // 入栈,栈内:[1]
st.push(2); // 入栈,栈内:[1,2]
st.pop(); // 出栈,栈内:[1]
cout << st.top(); // 输出栈顶元素:1
return 0;
}
3. 关联式容器(set/map)的特殊情况
set、map、unordered_set、unordered_map 这类关联式容器,底层是红黑树 / 哈希表,没有 “尾部”“头部” 的概念,因此既不用 push/pop,也不用 push_back/pop_back,而是用 insert 插入元素,erase 删除元素。
示例(map):
#include <map>
#include <iostream>
using namespace std;
int main() {
map<int, string> mp;
mp.insert({1, "a"}); // 插入键值对,mp = {1:"a"}
mp.erase(1); // 删除键为1的元素,mp 为空
return 0;
}
总结
-
push_back/pop_back:用于序列式容器(
vector/deque/list/string),操作容器的「尾部」,是这类容器的原生操作; -
push/pop:用于容器适配器(
stack/queue/priority_queue),是适配后的通用操作(屏蔽底层细节); -
关联式容器(
set/map):无push/pop/push_back/pop_back,统一用insert/erase操作元素。
核心记忆点:看容器结构 —— 序列式容器操作 “尾部”(back),适配器操作 “逻辑层”(push/pop),关联式容器用 insert/erase。
更多推荐

所有评论(0)