迭代器iterator是C++中用于遍历容器中元素的对象

embedded/2024/9/20 7:03:55/ 标签: c++, 开发语言

C++中的迭代器是一种对象,用于在容器中遍历元素。它提供了一种抽象的方式来访问容器中的元素,而不暴露底层数据结构的细节。通过迭代器,可以遍历顺序容器(如vector、list、deque等)、关联容器(如map、set等)以及其他容器类型(如数组等)中的元素。

在C++中,迭代器通常是类似指针的对象,可以通过解引用操作符*来访问其指向的元素,也可以通过递增操作符++来移动到容器中的下一个元素。

迭代器通常提供以下操作:

  1. 解引用操作:*it用于获取迭代器指向的元素。
  2. 递增操作:++it用于将迭代器移动到容器中的下一个元素。

迭代器的种类根据所操作的容器类型而有所不同。例如,对于顺序容器,迭代器是随机访问的,可以进行+-运算来快速定位元素;而对于关联容器,迭代器是双向的,只能进行单步移动,不能进行随机访问。

在使用迭代器时,需要注意迭代器的有效性,避免在容器中添加或删除元素时使迭代器失效。通常在循环中使用迭代器遍历容器时,会在每次循环迭代之前检查迭代器是否已经达到容器的末尾,以避免越界访问。

下面是一个简单的示例,演示了如何使用迭代器遍历vector容器中的元素:

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用迭代器遍历vector中的元素for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

在这个示例中,我们使用了vec.begin()vec.end()获取vector的起始和结束迭代器,并在循环中使用迭代器it来遍历vector中的元素,并通*it来访问元素的值

-

#include <iostream>
#include <map>int main() {std::map<std::string, int> myMap = {{"apple", 5},{"banana", 3},{"orange", 7}};// 查找键为"apple"的元素auto it = myMap.find("apple");// 如果找到了,则输出对应的值if (it != myMap.end()) {std::cout << "Value of apple: " << it->second << std::endl;} else {std::cout << "Key 'apple' not found!" << std::endl;}return 0;
}

在上下文中,it是一个迭代器变量,用于指向std::map中的元素。it是通过find方法找到的一个迭代器,指向std::map中指定键的元素(如果找到的话)。通常,我们会检查迭代器是否等于end()方法返回的迭代器,来确定是否找到了元素。

-

#include <iostream>
#include <set>int main() {std::set<int> mySet = {1, 2, 3, 4, 5};mySet.insert(6);mySet.erase(3);auto it = mySet.find(2);if (it != mySet.end()) {std::cout << "Found element: " << *it << std::endl;}return 0;
}

 -

以下是对C++中常见容器的简要总结:

1. **Array(数组)**:
   - 固定大小的容器,存储相同类型的元素。
   - 元素在内存中是连续存储的。
   - 访问元素的时间复杂度为 O(1)。
   - 大小在编译时确定,无法动态改变。

2. **Vector(向量)**:
   - 动态数组,大小可动态增长。
   - 元素在内存中是连续存储的。
   - 支持随机访问,时间复杂度为 O(1)。
   - 插入和删除操作可能导致内存重新分配,时间复杂度为 O(n)。

3. **List(链表)**:
   - 双向链表,可以快速在任意位置插入和删除元素。
   - 元素在内存中不一定是连续存储的。
   - 不支持随机访问,需要遍历链表才能访问元素。

4. **Queue(队列)**:
   - 先进先出(FIFO)的容器。
   - 支持在队尾插入元素,在队头删除元素。
   - 常用的操作有 `push()`(入队)、`pop()`(出队)、`front()`(获取队头元素)、`back()`(获取队尾元素)等。

5. **Stack(栈)**:
   - 后进先出(LIFO)的容器。
   - 支持在栈顶压入元素和弹出元素。
   - 常用的操作有 `push()`(压栈)、`pop()`(出栈)、`top()`(获取栈顶元素)等。

6. **Map(映射)**:
   - 键值对的容器,每个键对应一个值。
   - 基于红黑树实现,保持元素有序。
   - 查找、插入、删除操作的时间复杂度为 O(log n)。

7. **Set(集合)**:
   - 存储唯一元素的容器,不允许重复元素。
   - 基于红黑树实现,保持元素有序。
   - 查找、插入、删除操作的时间复杂度为 O(log n)。

这些容器都有各自的特点和适用场景,你可以根据具体需求选择合适的容器类型。


http://www.ppmy.cn/embedded/22437.html

相关文章

【调研分析】目标在不同焦距和距离下与画面的比例(2.8-3.6-4.0)

之前在做项目中需要极度优化效果和代码运行速度 为此测试了同一个目标在不同焦距和距离下与画面的比例&#xff0c;从而可以方便在指定大小情况下搜索目标 NOTE: 这是早期滑窗检测做目标检测下的工作

java项目:微信小程序基于SSM框架小说阅读器小程序【源码+数据库+毕业论文+PPT】

一、项目简介 本项目是一套基于SSM框架小说阅读器小程序 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐全、…

python代码实现支持向量机对鸢尾花分类

1、导入支持向量机模型&#xff0c;划分数据集 from sklearn import datasets from sklearn import svmirisdatasets.load_iris() iris_xiris.data iris_yiris.target indices np.random.permutation(len(iris_x)) iris_x_train iris_x[indices[:-10]] iris_y_train iris_y…

计算机网络之传输层TCP\UDP协议

UDP协议 用户数据报协议UDP概述 UDP只在IP数据报服务之上增加了很少功能&#xff0c;即复用分用和差错检测功能 UDP的主要特点&#xff1a; UDP是无连接的&#xff0c;减少开销和发送数据之前的时延 UDP使用最大努力交付&#xff0c;即不保证可靠交付&#xff0c;可靠性由U…

linux权限的概念

目录 shell命令以及运行原理 Linux权限的概念 Linux权限管理 文件类型和访问权限&#xff08;事物属性&#xff09; 快速修改权限的做法&#xff1a; 一个文件的权限谁能修改&#xff1f; 对比权限的有无&#xff0c;表现&#xff1a; 修改权限的第二套方法&#xff1…

「布道师系列文章」小红书黄章衡:AutoMQ Serverless 基石-秒级分区迁移

作者&#xff5c;黄章衡&#xff0c;小红书消息引擎研发专家 01 引言 Apache Kafka 因存算一体化架构&#xff0c;分区迁移依赖大量数据同步的完成&#xff0c;以一个 100MB/s 流量的 Kafka 分区为例&#xff0c;运行一天产生的数据量约为 8.2T&#xff0c;如果此时需要将该分…

访问控制列表配置实验

ACL&#xff0c;全称 Access Control List&#xff08;访问控制列表&#xff09;&#xff0c;是一种实现访问控制的机制&#xff0c;用于规定哪些主体&#xff08;如用户、设备、IP地址、进程等&#xff09;可以对哪些资源&#xff08;如网络服务、文件、系统对象等&#xff09…

xml,json和protobuffer

数据组织格式 xmljsonprotobuffer小结 xml 是以成对的方式,来表示"键值对"的信息,同时标签支持嵌套,可以构成更复杂的树形结构数据. 请求: <request> // 开始标签<username>zhangsan</username> // 表示的是键值对 key:username value: zhangsan&l…

NURBS样条曲线学习

搞3D几何内核算法研究&#xff0c;必须学习NURBS样条曲线曲面。 看《非均匀有理B样条 第2版》这本书&#xff0c;学习起来&#xff0c;事半功倍。 在《插件化算法研究平台》上&#xff0c;做了一个样条曲线研究功能&#xff0c;可以分析Bezier曲线、BSpline、NURBS曲线的各种…

Python常见的第三方库[详细解析]

Python是通过模块来体现库&#xff0c;常见的有标准库和第三方库。标准库是Python自带的库&#xff0c;在官方文档中可以查看&#xff0c;第三方库是其他大佬做出来的。 库它的优点有:1.降低程序员的学习成本 2.提高程序的开发效率 。 第1个常见的库为datetime&#xff0c;我们…

吉时利2450源表如何调整电流精度?

吉时利2450源表是一款高精度的电流源表&#xff0c;可用于精确控制和测量电流。调整电流精度是确保吉时利2450源表准确输出所需电流的关键步骤。本文将介绍吉时利2450源表如何调整电流精度的方法和注意事项。 准备工作 在开始调整电流精度之前&#xff0c;确保吉时利2450源表…

ArcGIS小技巧—基于DEM的河网提取

1、使用DEM数据提取河流水系网络 原始DEM数据中存在误差&#xff0c;或喀斯特地貌等真实地形情况&#xff0c;将引起DEM数据中存在凹陷区域。 在进行水流方向的计算上&#xff0c;如果有洼地会造成错误&#xff0c;因此我们需要进行填洼处理&#xff0c;获得相对准确的DEM数据…

手机测试之-adb

一、Android Debug Bridge 1.1 Android系统主要的目录 1.2 ADB工具介绍 ADB的全称为Android Debug Bridge,就是起到调试桥的作用,是Android SDK里面一个多用途调试工具,通过它可以和Android设备或模拟器通信,借助adb工具,我们可以管理设备或手机模拟器的状态。还可以进行很多…

10.JAVAEE之网络编程

1.网络编程 通过网络,让两个主机之间能够进行通信 >基于这样的通信来完成一定的功能进行网络编程的时候,需要操作系统给咱们提供一组 AP1, 通过这些 API才能完成编程&#xff08;API 可以认为是 应用层 和 传输层 之间交互的路径&#xff09;&#xff08;API:Socket API相当…

React | classnames

classnames 这个库在我们的项目中有大量的使用到&#xff0c;它不仅很实用&#xff0c;还非常好用&#xff0c;但还有人不知道这个库&#xff0c;我真的是十分心痛。 通过 classnames&#xff0c;我们可以给组件设置多个 className&#xff0c;还可以根据需要动态设置 classNa…

嵌入式学习——C语言基础——day11

1. 字符型数组和字符串的传参 1.1 常量和变量的区别&#xff08;难点&#xff09; 一般常量不能被修改&#xff0c;变量才能被修改 #include <stdio.h> int main(void) { char str[] {"hello world"};//定义数组&#xff0c;数组名为指针常量 char …

《QT实用小工具·四十六》多边形窗口

1、概述 源码放在文章末尾 该项目实现了可以移动的多边形窗口&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "polygonwindow.h"#include <QBitmap> #include <QQuickItem> #include <QQmlFile> #in…

排序算法(总结)-C++

排序算法 篇幅较长请耐心看完冒泡排序 ( B u b b l e S o r t Bubble Sort BubbleSort)选择排序 ( S e l e c t i o n S o r t Selection Sort SelectionSort)插入排序 ( I n s e r t i o n S o r t Insertion Sort InsertionSort)希尔排序 ( S h e l l S o r t Shell Sort She…

dockerfile 搭建lamp 实验模拟

一 实验目的 二 实验 环境 1, 实验环境 192.168.217.88一台机器安装docker 并做mysql nginx php 三台容器 2&#xff0c; 大致框架 3&#xff0c; php php:Nginx服务器不能处理动态页面&#xff0c;需要由 Nginx 把动态请求交给 php-fpm 进程进行解析 php有三…

使用VIVE Eye and Facial Tracking SDK 1.3.6.8 开发眼动追踪功能

在虚拟现实&#xff08;VR&#xff09;环境中&#xff0c;眼动追踪技术可以显著增强用户体验和应用的交互性。HTC Vive Focus 3是一款集成了眼动追踪功能的头戴式显示设备。本文详细介绍如何使用VIVE Sense的VIVE Eye and Facial Tracking SDK 1.3.6.8 在 Unity 中实现眼动追踪…