C++ 标准库容器常用成员函数
rbegin()end()C++ 标准库提供了多种容器类型,每种容器都有一系列成员函数。以下是主要容器(vectorarraylistdequesetmap。
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()); // 使用反向迭代器
更多推荐




所有评论(0)