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

浙公网安备 33010602011771号