C++笔记之尾后迭代器
code review!
参考笔记
1.C++笔记之尾后迭代器
2.C++笔记之迭代器失效问题处理
在C++中,尾后迭代器(通常称为 past-the-end iterator)是指指向容器中最后一个元素之后的位置的迭代器。它并不指向任何有效的元素,而是用来表示容器的结束边界。尾后迭代器通常通过容器的 end()
成员函数获取。
文章目录
- C++笔记之尾后迭代器
- 尾后迭代器的作用
- 使用尾后迭代器遍历容器
- 尾后迭代器与反向迭代器的区别
- 常见的误区与注意事项
- 尾后迭代器与标准库算法
尾后迭代器的作用
- 边界标识:尾后迭代器用于标识容器的结束位置,常与起始迭代器(
begin()
)一起用于遍历容器。 - 范围表示:在标准库算法中,尾后迭代器通常作为范围的结束参数,表示遍历的结束。
- 安全性:避免直接访问容器的非法内存位置,提高代码的安全性。
使用尾后迭代器遍历容器
以下是一个使用尾后迭代器遍历 std::vector
的示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用尾后迭代器遍历容器
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4 5
在这个示例中,vec.end()
返回一个尾后迭代器,it != vec.end()
用于判断是否已经遍历到容器的末尾。
尾后迭代器与反向迭代器的区别
需要注意的是,尾后迭代器与反向迭代器(reverse_iterator
)是不同的概念:
- 尾后迭代器 (
end()
) 指向容器的最后一个元素之后的位置,通常用于正向遍历。 - 反向迭代器 (
rbegin()
和rend()
) 用于反向遍历容器,rend()
相当于尾后迭代器,但在反向遍历的语境下。
示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用反向迭代器遍历容器
for (std::vector<int>::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit) {
std::cout << *rit << " ";
}
std::cout << std::endl;
return 0;
}
输出:
5 4 3 2 1
常见的误区与注意事项
-
解引用尾后迭代器:尾后迭代器不指向任何有效的元素,解引用它会导致未定义行为。
std::vector<int>::iterator it = vec.end(); // 错误:不应解引用尾后迭代器 // std::cout << *it;
-
迭代器失效:在对容器进行修改(如添加或删除元素)后,尾后迭代器可能会失效,使用前应确保迭代器的有效性。
-
混淆反向迭代器和尾后迭代器:反向迭代器是基于尾后迭代器实现的,但它们有不同的行为和用途,需根据需求选择正确的迭代器类型。
尾后迭代器与标准库算法
许多标准库算法使用尾后迭代器来定义操作范围。例如,std::find
的用法:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
int target = 30;
// 使用尾后迭代器作为范围
auto it = std::find(vec.begin(), vec.end(), target);
if (it != vec.end()) {
std::cout << "找到目标元素,值为:" << *it << std::endl;
} else {
std::cout << "未找到目标元素。" << std::endl;
}
return 0;
}
输出:
找到目标元素,值为:30
在这个例子中,std::find
会在 [vec.begin(), vec.end())
的范围内查找目标元素,vec.end()
作为尾后迭代器标识搜索的结束。