C++中迭代器笔记
C++中迭代器笔记
目的:为了统一遍历容器的操作,无序容器中同样可以使用迭代器,顺序则由实现此容器的对应数据结构的原理决定
迭代器的begin指向容器的第一个元素,end指向容器的最后一个元素的后一个元素
让我们一步一步解说迭代器的用法,最原始的用法:
#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 << " ";
}
return 0;
}
我们用std::vector
后来,可以用auto来定义一个迭代器,会自动识别容器的数据类型,定义对应的迭代器
这里的it可以理解为一个指针,这个*代表了指针指向的内容(即解引)
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}
离谱的来了,auto在不同的环境中的用法完全不一样
在传统的迭代器循环中,比如:
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
这里 it
是迭代器,需要使用 *it
来获取迭代器指向的元素。
而在范围-based for 循环中:
for (const auto& it : vec) {
std::cout << it << " ";
}
这里的it不是迭代器了,就是auto,原来C++这么智能,那我刚刚看了半天迭代器是在干啥我草
不对劲,刚刚又看了一些内容,在查找一个元素时,find的本质要么是一棵平衡二叉树(针对有序的set或者map),复杂度是logn,要么是1(针对无序的set或者map);而auto这么遍历的复杂度是n,所以在遍历时,用const auto&是没问题的,但是查找元素时还是用迭代器和find的组合更快。
大彻大悟了,如果只需要判断一个元素是否出现过,用unordered+find,通过哈希表可以把速度优化到1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!