C++ 标准库容器常用成员函数
C++ 标准库提供了多种容器类型,每种容器都有一系列成员函数。以下是主要容器(vector
, array
, list
, deque
, forward_list
, set
, map
等)的常用成员函数分类说明:
一、所有容器共有的成员函数
1. 容量相关
empty()
- 检查容器是否为空size()
- 返回元素数量(forward_list
没有)max_size()
- 返回容器可能包含的最大元素数
2. 迭代器相关
begin()/end()
- 返回指向开头/结尾的迭代器cbegin()/cend()
- 返回const迭代器(C++11)rbegin()/rend()
- 返回反向迭代器crbegin()/crend()
- 返回const反向迭代器(C++11)
二、序列容器特有函数(vector, array, list, deque, forward_list)
1. 元素访问
operator[]
- 访问指定位置元素(list
和forward_list
没有)at()
- 带边界检查的访问(list
和forward_list
没有)front()
- 访问第一个元素back()
- 访问最后一个元素(forward_list
没有)
2. 修改操作
push_back()
- 末尾添加元素(array
和forward_list
没有)pop_back()
- 移除末尾元素(array
和forward_list
没有)insert()
- 在指定位置插入元素erase()
- 删除指定位置元素clear()
- 清空容器
3. 特殊操作
assign()
- 替换容器内容resize()
- 改变容器大小swap()
- 交换两个容器内容
三、链表特有函数(list, forward_list)
push_front()/pop_front()
- 在头部添加/删除元素merge()
- 合并两个已排序链表splice()
- 从另一个链表移动元素remove()/remove_if()
- 删除满足条件的元素reverse()
- 反转链表顺序sort()
- 对链表进行排序unique()
- 删除连续重复元素
四、关联容器特有函数(set, map, multiset, multimap)
1. 查找操作
find()
- 查找指定键count()
- 统计键出现的次数lower_bound()/upper_bound()
- 返回键的边界equal_range()
- 返回匹配键的范围
2. 修改操作
insert()
- 插入元素emplace()
- 原位构造插入(C++11)erase()
- 删除元素extract()
- 提取节点(C++17)merge()
- 合并容器(C++17)
五、无序容器特有函数(unordered_set, unordered_map等)
bucket_count()
- 返回桶数bucket()
- 返回键所在的桶load_factor()
- 返回负载因子rehash()
- 设置桶数reserve()
- 预留空间
六、容器适配器特有函数(stack, queue, priority_queue)
push()
- 插入元素pop()
- 删除顶部/前端元素top()
- 访问顶部元素(stack/priority_queue)front()
- 访问前端元素(queue)
使用示例
// vector示例
std::vector<int> v = {1, 2, 3};
v.push_back(4);
int val = v.at(2);// list示例
std::list<int> lst = {1, 2, 3};
lst.push_front(0);
lst.sort();// map示例
std::map<std::string, int> m;
m["apple"] = 5;
auto it = m.find("apple");// unordered_set示例
std::unordered_set<int> s = {1, 2, 3};
s.insert(4);
size_t buckets = s.bucket_count();
性能考虑
vector
:随机访问快,尾部操作快,中间插入/删除慢list
:插入/删除快,随机访问慢deque
:头尾操作快,中间操作慢set/map
:查找快,保持有序unordered_set/unordered_map
:平均查找最快,但不保持顺序
选择容器时应根据具体的使用场景和性能需求来决定。
C++ 中的 rbegin()
和 end()
方法详解
rbegin()
和 end()
是 C++ 标准库容器中用于控制元素访问范围的重要成员函数,它们分别代表了反向迭代的起点和正向迭代的终点。
rbegin()
方法
基本特性
功能:返回指向容器最后一个元素的反向迭代器
适用容器:所有支持双向迭代的容器(vector, deque, list, set, map等)
使用方式
std::vector<int> v = {1, 2, 3, 4};
auto rit = v.rbegin(); // 指向4的反向迭代器
主要特点
与
rend()
配对使用,构成反向迭代范围解引用后可直接访问元素值
递增操作(
++
)会向容器前端移动空容器时
rbegin() == rend()
应用示例
// 反向遍历vector
std::vector<int> v = {1, 2, 3, 4};
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {std::cout << *rit << " "; // 输出: 4 3 2 1
}// 修改最后一个元素
if (!v.empty()) {*v.rbegin() = 10; // 将4改为10
}
end()
方法
基本特性
功能:返回指向容器"尾后"位置的正向迭代器
适用容器:所有标准容器
使用方式
std::vector<int> v = {1, 2, 3};
auto it = v.end(); // 指向3之后的位置
主要特点
与
begin()
配对使用,构成正向迭代范围不解引用(解引用是未定义行为)
空容器时
begin() == end()
常用于循环终止条件和算法参数
rbegin()
和 end()
的关键区别
特性 | rbegin() | end() |
---|---|---|
迭代方向 | 反向(从尾到头) | 正向(从头到尾) |
指向位置 | 最后一个元素 | 最后一个元素的下一个位置 |
解引用 | 可以解引用访问元素 | 不可解引用 |
典型用途 | 反向遍历、访问尾部元素 | 循环终止、范围界定 |
空容器 | rbegin() == rend() | begin() == end() |
应用示例
// 正向遍历vector
for (auto it = v.begin(); it != v.end(); ++it) {std::cout << *it << " "; // 输出: 1 2 3
}// 配合算法使用
auto found = std::find(v.begin(), v.end(), 2);
if (found != v.end()) {// 找到了元素2
}
获取最后一个元素的三种方式:
// 方法1(推荐)
int last1 = vec.back();// 方法2
int last2 = *vec.rbegin();// 方法3(不推荐)
int last3 = *(vec.end() - 1);
使用反向迭代器实现降序排序
std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};// 先升序排序,然后反转
std::sort(vec.begin(), vec.end()); // 升序
std::reverse(vec.begin(), vec.end()); // 反转得到降序// 或者一步完成
std::sort(vec.rbegin(), vec.rend()); // 使用反向迭代器