内容纲要
(1) vector
(动态数组)
特点:
- 动态大小,类似
array
,但可以自动扩容。 - 随机访问快(O(1)),但在中间插入/删除较慢(O(n))。
主要函数:
函数 | 作用 | 返回值类型 | 返回值描述 |
---|---|---|---|
push_back(x) |
在末尾插入元素 | void |
无返回值 |
pop_back() |
删除末尾元素 | void |
无返回值 |
front() / back() |
返回首/尾元素 | T& / const T& |
返回首/尾元素的引用 |
at(i) |
访问索引 i 处的元素(带边界检查) |
T& / const T& |
返回索引 i 处的元素(带边界检查) |
operator[i] |
访问索引 i 处的元素(无边界检查) |
T& / const T& |
返回索引 i 处的元素(无边界检查) |
size() / capacity() |
获取大小 / 容量 | size_t |
返回元素个数 / 容量 |
insert(it, x) |
在迭代器 it 处插入 x |
iterator |
返回插入位置的迭代器 |
erase(it) |
删除迭代器 it 指向的元素 |
iterator |
返回删除元素后的下一个迭代器 |
clear() |
清空所有元素 | void |
无返回值 |
🔹 示例
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3};
v.push_back(4); // {1, 2, 3, 4}
v.pop_back(); // {1, 2, 3}
cout << v[1] << endl; // 2
}
(2) deque
(双端队列)
特点:
- 支持两端插入/删除(
push_front
和push_back
)。 - 比
vector
更适合频繁头部插入/删除。
主要函数:
函数 | 作用 | 返回值类型 | 返回值描述 |
---|---|---|---|
push_front(x) / push_back(x) |
头/尾部插入元素 | void |
无返回值 |
pop_front() / pop_back() |
头/尾部删除元素 | void |
无返回值 |
front() / back() |
访问首/尾元素 | T& / const T& |
返回首/尾元素的引用 |
operator[i] |
访问索引 i 处的元素 |
T& / const T& |
返回索引 i 处的元素 |
size() / clear() |
获取大小 / 清空所有元素 | size_t / void |
返回队列大小 / 无返回值 |
🔹 示例
#include <deque>
#include <iostream>
using namespace std;
int main() {
deque<int> dq = {1, 2, 3};
dq.push_front(0); // {0, 1, 2, 3}
dq.pop_back(); // {0, 1, 2}
cout << dq.front() << endl; // 0
}
queue
(普通队列,FIFO)
特点:
- 先进先出(FIFO):先插入的元素先取出。
-
底层实现:通常基于
deque
(双端队列)。常用函数
函数 | 作用 | 返回值类型 | 返回值描述 |
---|---|---|---|
push(x) |
入队,在队尾添加元素 | void |
无返回值 |
pop() |
出队,删除队头元素 | void |
无返回值 |
front() |
返回队头元素 | T& / const T& |
返回队头元素的引用 |
back() |
返回队尾元素 | T& / const T& |
返回队尾元素的引用 |
size() |
返回队列大小 | size_t |
返回队列大小 |
empty() |
判断队列是否为空 | bool |
若队列为空返回 true ,否则返回 false |
(3) list
(双向链表)
特点:
- 插入/删除快(O(1)),但不支持随机访问(O(n))。
- 适用于频繁增删的场景。
主要函数:
函数 | 作用 | 返回值类型 | 返回值描述 |
---|---|---|---|
push_front(x) / push_back(x) |
头/尾部插入元素 | void |
无返回值 |
pop_front() / pop_back() |
头/尾部删除元素 | void |
无返回值 |
insert(it, x) |
在迭代器 it 位置插入 x |
iterator |
返回插入位置的迭代器 |
erase(it) |
删除迭代器 it 指向的元素 |
iterator |
返回删除元素后的下一个迭代器 |
sort() |
排序所有元素 | void |
无返回值 |
🔹 示例
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> l = {1, 2, 3};
l.push_front(0); // {0, 1, 2, 3}
l.pop_back(); // {0, 1, 2}
}
(4) set
(集合,自动排序)
特点:
- 元素唯一,自动按升序排列。
- 查找
O(log n)
,插入/删除O(log n)
。
主要函数:
函数 | 作用 | 返回值类型 | 返回值描述 |
---|---|---|---|
insert(x) |
插入 x |
pair<iterator, bool> |
返回插入位置的迭代器和是否插入成功(bool 值) |
erase(x) |
删除 x |
size_t |
返回删除的元素个数 |
count(x) |
判断 x 是否存在(返回 0/1 ) |
size_t |
若 x 存在则返回 1 ,否则返回 0 |
find(x) |
查找元素 x |
iterator |
返回 x 的迭代器,若不存在返回 end() |
lower_bound(x) |
返回 ≥ x 的最小元素的迭代器 |
iterator |
返回 ≥ x 的最小元素的迭代器 |
upper_bound(x) |
返回 > x 的最小元素的迭代器 |
iterator |
返回 > x 的最小元素的迭代器 |
🔹 示例
#include <set>
#include <iostream>
using namespace std;
int main() {
set<int> s = {3, 1, 4};
s.insert(2); // {1, 2, 3, 4}
s.erase(3); // {1, 2, 4}
}
(5) map
(键值对映射,自动排序)
特点:
- 键唯一,按键升序存储。
- 使用
O(log n)
查找、插入。
主要函数:
函数 | 作用 | 返回值类型 | 返回值描述 |
---|---|---|---|
m[key] = value |
插入/修改键值对 | T& |
插入或修改键值对,返回值为对应键的引用 |
insert({key, value}) |
插入键值对(不会覆盖已存在的键) | pair<iterator, bool> |
返回插入位置的迭代器和是否插入成功(bool 值) |
erase(key) |
删除键值对 | size_t |
返回删除的元素个数 |
find(key) |
查找键值对 | iterator |
返回 key 的迭代器,若不存在返回 end() |
count(key) |
判断 key 是否存在 |
size_t |
若 key 存在则返回 1 ,否则返回 0 |
lower_bound(key) |
返回 ≥ key 的最小元素 |
iterator |
返回 ≥ key 的最小元素的迭代器 |
upper_bound(key) |
返回 > key 的最小元素 |
iterator |
返回 > key 的最小元素的迭代器 |
🔹 示例
#include <map>
#include <iostream>
using namespace std;
int main() {
map<string, int> m;
m["apple"] = 10;
cout << m["apple"] << endl; // 10
}
(6) Pair
pair
是一个模板类,它允许我们创建一个存储两个不同类型元素的对象。pair
类模板的定义如下:
template <class T1, class T2>
struct pair {
T1 first;
T2 second;
pair();
pair(const T1& a, const T2& b);
pair(const pair& p);
pair(pair&& p);
};
T1
和T2
是pair
的两个元素类型。-
first
和second
分别表示第一个和第二个元素。pair
主要函数与操作
函数 | 作用 | 返回值类型 | 返回值描述 |
---|---|---|---|
first |
存储 pair 中的第一个元素 |
T1& / const T1& |
对第一个元素的引用 |
second |
存储 pair 中的第二个元素 |
T2& / const T2& |
对第二个元素的引用 |
make_pair(a, b) |
创建一个 pair 对象,并用 a 和 b 初始化它 |
pair<T1, T2> |
返回一个 pair 对象 |
make_pair
函数
make_pair
是一个非常有用的函数模板,用于方便地创建 pair
对象。它会自动推断类型,因此在使用时不需要显式指定模板参数。
pair<int, string> p = make_pair(1, "apple");