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::iterator来定义一个迭代器(迭代器的英文就是iterator)

后来,可以用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

posted @   huigugu  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示