C++---迭代器介绍

news2024/12/27 0:21:39

在这里插入图片描述


迭代器的介绍

使用迭代器需要引用头文件,但一般的容器都引用了这个头文件。
在这里插入图片描述
这五种迭代器的声明如下:

struct output_iterator_tag { };//输出迭代器
struct input_iterator_tag{ };//输入迭代器
struct forward_iterator_tag : public input_iterator_tag {};//向前迭代器
struct bidirectional_iterator_tag : public forward_iterator_tag {};//双向迭代器
struct random_access_iterator_tag : public bidirectional_iterator_tag{};//随机迭代器

在这里插入图片描述
在这里插入图片描述

迭代器的适配器

Insert迭代器,也称为inserter,用于安插新数据。利用这种迭代器,算法将执行安插(insert)而不是赋值(虽然操作是赋值)。

#include <iterator>
#include <vector>
#include <iostream>
using namespace std;

//输出coll的所有元素值
template<typename T>
void Show(const T& coll)
{
    for (auto& x : coll)
        cout << x << " ";
    cout << endl;
}

int main()
{
    vector<int> v;

    //auto it1 = v.begin();
    //for (int i = 0; i < 3; i++)//错误,v是空的容器,不能通过普通迭代器赋值(插入)数据
    //{
    //    *it1 = i;
    //    it1++;
    //}
    Show(v); //输出容器的所有元素

    //通过类创建对象
    back_insert_iterator<vector<int> > it2(v);//创建插入迭代器对象
    it2 = 1;  //不解引用直接赋值
    it2++;   //迭代器后移
    *it2 = 2; //解引用赋值,和直接赋值一样,等同it2 = 2;
    ++it2;  //迭代器后移,等同it2++
    *it2 = 3;
    Show(v);//输出容器的所有元素

    //通过函数创建对象
    back_inserter(v) = 4;//用函数创建插入迭代器并赋值
    *back_inserter(v) = 5;//用函数创建插入迭代器并赋值
    Show(v);

    //接收函数返回值,可以多次使用
    auto it3 = back_inserter(v);//这种最简单好用
    *it3++ = 6;
    it3++ = 7;
    it3 = 8;
    it3 = 9;//这行并没有用9覆盖8,而是在后面新插入一个9

    Show(v);

    return 0;
}

说明:
1.容器不能通过普通的迭代器插入数据。
2.可以通过back_insert_iterator创建尾插迭代器对象,也可以通过back_inserter函数创建尾插迭代器对象。
3.注意it2 = 1和*it2 = 2都是插入一个数据而不是赋值。
4.建议使用back_inserter,更简单。

在这里插入图片描述
所以上面的程序,可以用下面更简单的方法实现

int main()
{
    vector<int> v;

    //接收函数返回值,可以多次使用
    auto it3 = back_inserter(v);//这种最简单好用
    for (int i = 1; i < 10; i++)
        it3 = i; //插入i

    Show(v);

    return 0;
}

安插迭代器种类

C++标准库提供三种insert迭代器(适配器):back inserter(尾插迭代器),front inserter(头插迭代器)和general inserter(一般插入迭代器)。它们的区别在于插入的位置。每一种迭代器都可以通过一个函数生成和初始化。

在这里插入图片描述
上表中cont表示容器,pos表示插入位置迭代器,value表示插入的元素。
当然,容器本身必须支持安插迭代器所调用的容器内部的函数。


本篇完!

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

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

相关文章

【MySQL】SQL 基础

文章目录 【 1. SQL 的书写规则 】1.1 大小写规则1.2 常量的表示1.3 注释1.4 HELP 系统帮助 【 2. 常用数据库函数 】2.1 SHOW DATABASES 显示数据库2.2 CREATE DATABASE 创建数据库2.3 ALTER DATABASE 修改数据库2.4 DROP DATABASE 删除数据库2.5 USE 选择数据库 【 3. RDBMS …

防火墙如何端口映射?

防火墙端口映射&#xff08;Firewall Port Mapping&#xff09;是一种网络技术&#xff0c;通过对防火墙配置进行调整&#xff0c;允许外部网络用户访问内部网络中的指定端口。该技术使得外部用户可以通过公共网络访问内部网络中的特定服务或应用程序&#xff0c;从而实现远程访…

Golang | Leetcode Golang题解之第117题填充每个节点的下一个右侧节点指针II

题目&#xff1a; 题解&#xff1a; func connect(root *Node) *Node {start : rootfor start ! nil {var nextStart, last *Nodehandle : func(cur *Node) {if cur nil {return}if nextStart nil {nextStart cur}if last ! nil {last.Next cur}last cur}for p : start; …

第13章 层次式架构设计理论与实践

层次式架构的核心思想是将系统组成为一种层次结构&#xff0c;每一层为上层服务&#xff0c;并作为下层客户。其实不管是分层还是其他的架构都是为了解耦&#xff0c;更好的复用&#xff0c;只要秉承着这种思想去理解一切都迎刃而解了。 13.1 层次上体系结构概述 回顾一下软件…

散户如何参与期权交易?

期权就是股票&#xff0c;唯一区别标的物上证指数&#xff0c;会看大盘吧&#xff0c;期权交易两个方向认购做多&#xff0c;认沽做空&#xff0c;双向t0交易没了&#xff0c;期权交易跟期货一样&#xff0c;对的&#xff0c;玩的也是合约&#xff0c;唯一区别没有保证金不会爆…

redis显示RDB error

报错问题&#xff1a;"RDB error" 是指在Redis的RDB持久化过程中出现了错误。Redis的RDB持久化是通过将内存中的数据集快照保存到磁盘中的一种方式。如果在这个过程中遇到问题&#xff0c;Redis会记录一条包含"RDB error"的日志信息。上图错误&#xff0c;…

k8s群集调度之 pod亲和 node亲和 标签指定

目录 一 调度约束 1.1K8S的 List-Watch 机制 ⭐⭐⭐⭐⭐ 1.1.1Pod 启动典型创建过程 二、调度过程 2.1Predicate&#xff08;预选策略&#xff09; 常见的算法 2.2priorities&#xff08;优选策略&#xff09;常见的算法 三、k8s将pod调度到指定node的方法 3.1指…

写论文时某一行的字间距突然增大,如何解决?

问题描述&#xff1a; 某一行的字间距突然变大&#xff0c;占满了一行&#xff0c;检查设置也没有异常。 如何解决 一、全选出现问题的段落 二、右键&#xff0c;然后点击段落 三、然后勾选允许西文在单词中间换行 四、正常了

电源模块测试系统怎么测试输入电压范围?

在现代电子设备中&#xff0c;电源模块的性能直接影响着整个系统的稳定性和效率。其中&#xff0c;电源输入电压范围是指电源能够接受的输入电压的最小值和最大值&#xff0c;它是确保电源正常工作的重要参数。为了提高测试效率和精度&#xff0c;自动化的测试方法逐渐取代了传…

解决IDEA菜单栏找不到VCS的问题,且使用IDEA推送新项目到托管仓库

问题描述&#xff1a; 在idea软件中使用git推送项目&#xff0c;idea页面顶部菜单栏无VCS 解决方案&#xff1a; 一&#xff1a;File->Settings->Version Control-> 点击 ->选择项目->VCS:->点击ok&#xff1a; 二&#xff1a;托管平台创建一个Git仓库来保…

MongoDB数据库(10亿条数据)清理策略: 自动化过期数据删除实战

1、引言 随着应用程序和业务数据的持续增长&#xff0c;有效地管理数据库存储空间成为维护系统性能的关键。在MongoDB这类NoSQL数据库中&#xff0c;定期清理过期数据变得尤为重要&#xff0c;这不仅能释放宝贵的存储资源&#xff0c;还能优化查询性能&#xff0c;确保数据库运…

python数据分析——分组操作1

参考资料&#xff1a;活用pandas库 1、简介 借助“分割-应用-组合”&#xff08;split-apply-combine&#xff09;模式&#xff0c;分组操作可以有效地聚合、转换和过滤数据。 分割&#xff1a;基于键&#xff0c;把要处理的数据分割为小片段。 应用&#xff1a;分别处理每个数…

Raven2掠夺者2渡鸦2游戏预约注册教程 账号注册教程

《渡鸦2》是一款源自韩国的创新力作&#xff0c;作为《Raven》系列的最新续篇&#xff0c;这款游戏在MMORPG手游领域内再度扩展了其标志性的暗黑奇幻宇宙&#xff0c;融入了大量革新的游戏设计与丰富内容。定档于2024年5月29日开启公测的《渡鸦2》&#xff0c;正处在紧张刺激的…

简单四步完成基于云服务器ARL资产侦察灯塔系统搭建

简单四步完成基于云服务器ARL资产侦察灯塔系统搭建及使用 前言 官网介绍&#xff1a;ARL全称-Asset Reconnaissance Lighthouse&#xff0c;中文含义&#xff1a;资产侦察灯塔系统。 旨在快速侦察与目标关联的互联网资产&#xff0c;构建基础资产信息库。 协助甲方安全团队或…

数组-捡石子小游戏

一、题目描述 二、解题思路 刚开始拿到题目的时候在想是不是需要把所有情况枚举出来&#xff0c;其实思考一下能看出规律&#xff1a; 1.如果有1、2、3颗石子&#xff0c;小牛一定可以赢&#xff1b; 2.再来看4颗石子的时候&#xff0c;小牛A可以拿1~3颗&#xff0c;但是无论小…

M功能-分布式锁-支付平台(五)

target&#xff1a;离开柬埔寨倒计时-218day 珍藏的图片又拿出来了 前言 M系统中的撮合引擎是最最核心的功能&#xff0c;第一版的撮合引擎不是我写的&#xff0c;也没有做交易对的动态分配这样的功能&#xff0c;都是基于抢锁方式来决定谁拥有该交易对的撮合权限&#xff0c;所…

【Qt秘籍】[003]-Qt环境变量配置-磨刀不误砍柴工

一、为什么要设置环境变量 &#xff1f;[原因] 配置PATH环境变量的主要用处在于让操作系统能够识别并执行不在当前工作目录下的可执行文件。具体来说&#xff0c;它的作用包括&#xff1a; 命令执行便捷性&#xff1a;当你在命令行输入一个命令&#xff08;如java, python或np…

Collection(一)[集合体系]

说明&#xff1a;Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。 Collection集合体系&#xff1a; Collection<E> 接口 (一&#xff09;List<E> 接口 说明&#xff1a;添加的元素是有序、可重复、有索引。 1. ArrayLi…

在table中获取每一行scope的值

目的 当前有一份如下数据需要展示在表格中&#xff0c;表格的页面元素套了一个折叠面板&#xff0c;需要循环page_elements中的数据展示出来 错误实践 将template放在了折叠面板中&#xff0c;获取到的scope是空数组 <el-table-column label"页面元素" show-o…

【技术实操】银河高级服务器操作系统实例分享,达梦数据库服务器 oom 问题分析

1. 服务器环境以及配置 【 机型】 处理器&#xff1a; HUAWEIKunpeng 920 5220 内存&#xff1a; 400518528 kB 主板型号&#xff1a; Chaoqiang K620 series 整机类型/架构&#xff1a; ARM BIOS 版本&#xff1a; KL4.41.028.TF.220224.R 固件版本&#xff1a; KL4.41…