c++笔记容器和迭代器

C++中的迭代器是一个功能强大的工具,用于遍历和操作容器中的元素。深入理解迭代器的类型、特性和用法,以及如何与各类容器配合使用,是编写高效、健壮C++代码的关键。下面将深入探讨迭代器的概念、与容器的配合使用、以及注意事项。

迭代器类型

  1. 输入迭代器:支持只读访问,允许单次遍历序列。常用于算法的输入操作。
  2. 输出迭代器:支持只写访问,允许单次遍历序列。常用于算法的输出操作。
  3. 前向迭代器:支持读写访问,允许多次遍历序列。常用于链表等容器。
  4. 双向迭代器:支持前向和后向遍历,允许多次遍历序列。常用于链表、集合、映射等容器。
  5. 随机访问迭代器:支持常数时间的随机访问,允许多次遍历序列。常用于数组、向量、双端队列等容器。

迭代器与容器的配合使用

1. std::vector

std::vector使用随机访问迭代器,支持高效的随机访问和顺序遍历。

示例代码

#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 << " ";}std::cout << std::endl;// 反向遍历for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) {std::cout << *rit << " ";}std::cout << std::endl;return 0;
}
2. std::list

std::list使用双向迭代器,支持高效的前向和后向遍历。

示例代码

#include <iostream>
#include <list>int main() {std::list<int> lst = {1, 2, 3, 4, 5};// 正向遍历for (auto it = lst.begin(); it != lst.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 反向遍历for (auto rit = lst.rbegin(); rit != lst.rend(); ++rit) {std::cout << *rit << " ";}std::cout << std::endl;return 0;
}
3. std::deque

std::deque使用随机访问迭代器,支持高效的随机访问和双端操作。

示例代码

#include <iostream>
#include <deque>int main() {std::deque<int> deq = {1, 2, 3, 4, 5};// 正向遍历for (auto it = deq.begin(); it != deq.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 反向遍历for (auto rit = deq.rbegin(); rit != deq.rend(); ++rit) {std::cout << *rit << " ";}std::cout << std::endl;return 0;
}
4. std::mapstd::set

std::mapstd::set使用双向迭代器,支持有序遍历。

示例代码

#include <iostream>
#include <map>
#include <set>int main() {std::map<int, std::string> mp = {{1, "one"}, {2, "two"}, {3, "three"}};std::set<int> st = {1, 2, 3, 4, 5};// 遍历mapfor (auto it = mp.begin(); it != mp.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;}// 遍历setfor (auto it = st.begin(); it != st.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}
5. std::unordered_mapstd::unordered_set

std::unordered_mapstd::unordered_set使用前向迭代器,支持无序遍历。

示例代码

#include <iostream>
#include <unordered_map>
#include <unordered_set>int main() {std::unordered_map<int, std::string> ump = {{1, "one"}, {2, "two"}, {3, "three"}};std::unordered_set<int> ust = {1, 2, 3, 4, 5};// 遍历unordered_mapfor (auto it = ump.begin(); it != ump.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;}// 遍历unordered_setfor (auto it = ust.begin(); it != ust.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

迭代器操作函数

以下是所有标准容器通用的迭代器操作函数:

  • begin(): 返回指向容器第一个元素的迭代器。
  • end(): 返回指向容器末尾的迭代器(指向最后一个元素之后的位置)。
  • rbegin(): 返回指向容器最后一个元素的反向迭代器。
  • rend(): 返回指向容器第一个元素之前位置的反向迭代器。
  • cbegin(): 返回指向容器第一个元素的常量迭代器。
  • cend(): 返回指向容器末尾的常量迭代器。
  • crbegin(): 返回指向容器最后一个元素的常量反向迭代器。
  • crend(): 返回指向容器第一个元素之前位置的常量反向迭代器。

迭代器使用注意事项

  1. 迭代器失效问题

    • 对容器进行插入、删除等修改操作可能会导致迭代器失效。特别是在std::vectorstd::deque中,插入和删除操作可能会导致重新分配和拷贝,从而使迭代器失效。
    • std::list和关联容器(如std::mapstd::set)在进行插入和删除操作时,其迭代器通常不会失效。
  2. 避免越界访问

    • 迭代器的end()指向的是容器末尾元素之后的位置,访问该位置会导致未定义行为。因此,遍历时要确保迭代器没有超出end()
  3. 常量迭代器

    • 使用常量迭代器(如const_iterator)可以防止意外修改容器中的元素,增强代码的安全性和可读性。
    • 常量迭代器只能读取元素,不能修改元素。
  4. 范围循环

    • C++11引入的范围循环提供了更简洁的语法进行遍历,推荐在不需要显式迭代器的情况下使用:
      std::vector<int> vec = {1, 2, 3, 4, 5};
      for (int val : vec) {std::cout << val << " ";
      }
      std::cout << std::endl;
      
  5. 算法库结合使用

    • C++标准库提供了一组强大的算法,如std::for_eachstd::findstd::sort等,这些算法通常结合迭代器使用,能简化代码并提高可读性。
      #include <algorithm>
      #include <vector>
      #include <iostream>int main() {std::vector<int> vec = {4, 2, 3, 1, 5};// 使用std::sort排序std::sort(vec.begin(), vec.end());// 使用std::for_each遍历并打印std::for_each(vec.begin(), vec.end(), [](int val) {std::cout << val << " ";});std::cout << std::endl;return 0;
      }
      

通过深入理解迭代器的类型和用法,以及与各类容器的配合使用,可以编写更加高效、健壮和可维护的C++代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样查看自己的Windows电脑最近弄了哪些内容

一、需求说明 有时候我们的电脑别人需要使用&#xff0c;你不给他使用又不行&#xff0c;且你也不在电脑身边&#xff0c;你只能告诉他自己的电脑密码让他操作&#xff0c;此时你并不不知道他操作了哪些内容。 还有一个种情况是自己不在电脑旁边&#xff0c;且电脑没有锁屏&…

SQL游标的应用场景及使用方法

SQL游标的应用场景及使用方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨SQL中游标的应用场景及使用方法。游标在SQL中是一种重要的数据…

Pytest集成Allure生成测试报告

# 运行并输出报告在Report文件夹下 查看生成的allure报告 1. 生成allure报告&#xff1a;pycharm terminal中输入命令&#xff1a;产生报告文件夹 pytest -s --alluredir../report 2. pycharm terminal中输入命令&#xff1a;查看生成的allure报告 allure serve ../report …

傻瓜交换机多网段互通组网、设备无法配置网关案例

记录一下&#xff1a; 一、傻瓜交换机多网段互通组网 1、客户在核心交换机上创建了VLAN10&#xff0c;VLAN20。 VLAN10&#xff1a;IP192.168.10.254 VLAN20&#xff1a;IP192.168.20.254 在核心交换机下挂了一台傻瓜交换机&#xff0c;傻瓜交换机接入了一台OA服务器IP&#…

Python基础之IO流和序列化讲解

文章目录 1 IO流1.1 简介1.1.1 定义1.1.2 同步&异步IO 1.2 输入输出1.2.1 输出格式美化1.2.2 str.format()1.2.3 旧式字符串格式化1.2.4 读取键盘输入 1.3 文件操作1.3.1 读和写文件1.3.1.1 open()1.3.1.2 读取其他文件1.3.1.2.1 二进制文件1.3.1.2.2 字符编码 1.3.2 文件对…

【linux/shell实战案例】在shell中插入Python代码及EOF解析

目录 一.什么情况需要在shell中插入Python代码 二.如何在shell中插入Python代码 三.什么是内联输入重定向&#xff1f; 四.什么是EOF 五.为什么要用EOF 六.<<EOF和<<-EOF的区别 七.案例代码 一.什么情况需要在shell中插入Python代码 shell不好处理的数据或…

前端requestAnimationFrame动画

题目:我们来实现一个最简单的需求,将一个元素从屏幕左边均匀地移动到屏幕右边。 一、CSS实现 用 css 实现是最合理也是最高效的,示例代码如下。 @keyframes move_animation1 {0% { left: 0px; }100% { left: calc(100% - 60px); } } @keyframes move_animation {0% { tra…

压缩pdf在线工具,压缩pdf大小的软件

如何有效地压缩PDF文件大小却是个问题&#xff0c;为了获得最佳的压缩效果&#xff0c;我们必须依赖专业的压缩工具&#xff0c;采用错误的方法可能会对文件内容产生负面影响&#xff0c;甚至导致文件无法打开&#xff0c;今天&#xff0c;我将分享一些独特的压缩技巧&#xff…

【leetcode——有效的括号】

最近换实习很久不刷leetcode。。真的有点手生了&#xff0c;还是要坚持刷阿&#xff01; 有效的括号这道题就是实现了一个相互匹配&#xff0c;那么基本上就是用字典&#xff0c;那么如何灵活的用字典&#xff0c;可以使用括号对应数字取加和判断&#xff0c;也可以就单独压入…

如何在Spring Boot中实现OAuth2认证

如何在Spring Boot中实现OAuth2认证 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何在Spring Boot应用中实现OAuth2认证&#x…

HP UX服务器监控指标解读(SSH)

在当今复杂多变的IT环境中&#xff0c;服务器的性能和稳定性是企业运营的关键。HP UX作为一款高性能的Unix服务器操作系统&#xff0c;其监控管理显得尤为重要。监控易作为一款功能强大的监控软件&#xff0c;为HP UX服务器提供了全面的监控解决方案。本文将针对监控易中HP UX服…

在编译 PHP 8.3.8 时遇到 configure: error: Package requirements (libxml-2.0 >= 2.9.0)

configure: error: Package requirements (libxml-2.0 > 2.9.0) were not met: 在编译 PHP 8.3.8 时遇到 configure: error: Package requirements (libxml-2.0 > 2.9.0) were not met 错误时&#xff0c;可能是因为 pkg-config 无法找到 libxml2 的开发文件或路径。以下…

小程序接口报错ERR_CERT_COMMON_NAME_INVALID

收到 ERR_CERT_COMMON_NAME_INVALID 错误&#xff0c;可能是因为使用了不受信任的证书或自签名证书。以下是一些可能的解决方法&#xff1a; 1. 检查域名配置&#xff1a; • 确保 manifest.json 中的合法域名配置正确。 • 确认微信小程序后台也添加了对应的域名。 2. 使用…

C++进阶之哈希

一、unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c;进行…

【python012】Python根据页码处理PDF文件的内容

在日常工作和学习中&#xff0c;需要从PDF文件中提取特定页面的内容&#xff0c;以便进行知识、材料压缩等。 2.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起来&#xff01; 3.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起…

CF814 D. An overnight dance in discotheque [树形dp+提前处理祖先需要的状态]

传送门 [前题提要]:本题的树形dp的思考方式既考虑子孙需要的贡献以及提前预处理出祖先节点所需要的状态,感觉是我几乎没有碰到过的姿势,平时遇到的大部分的树形dp大都是单单考虑子树的贡献以及限制,感觉很新,故写篇博客记录一下 当然本题具有一个更为"简单"的贪心解…

MyBatis Plus条件构造器使用

1Wrapper&#xff1a; 条件构造抽象类&#xff0c;最顶端父类 1.1 AbstractWrapper&#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 1.2 QueryWrapper&#xff1a; Entity 对象封装操作类&#xff0c;不是用lambda语法 1.3 UpdateWrapper&#xff1a; Update…

【工具分享】Nuclei

文章目录 NucleiLinux安装方式Kali安装Windows安装 Nuclei Nuclei 是一款注重于可配置性、可扩展性和易用性的基于模板的快速漏洞验证工具。它使用 Go 语言开发&#xff0c;具有强大的可配置性、可扩展性&#xff0c;并且易于使用。Nuclei 的核心是利用模板&#xff08;表示为简…

前端学习笔记(2406261):jquery使用checkbox控制页面自动刷新

文章目录 需求登录页面主页面 API用户登录login获取数据getdata 代码登录页面主页面 关于后端 需求 这是一个物联网的演示项目&#xff0c;web端能够实时显示后台数据的变化&#xff0c;其流程非常简单&#xff1a; 用户登录登录成功后显示主界面面主界面进入后自动显示数据数…

仓库管理系统19--盘存管理

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、什么是盘存 盘存也叫盘库&#xff0c;盘库是指对一个仓库、库房或者商店的库存进行全面清点和核对的过程。在盘库过程中&am…