C++迭代器作为参数传递进函数使用时的注意事项

2023-11-09

                                                                         外部函数对迭代器进行值传递而非引用

     需要注意的一点是在使用迭代器作为传入参数进行迭代器运算操作的时候,作用对象仅仅是对传入迭代器的拷贝,因为在传入迭代器后函数直接对传入的对象进行拷贝操作而不访问源对象的内存空间https://blog.csdn.net/hp_truth/article/details/40189291

    因此,如果在外部函数内进行迭代器操作将不会影响主函数内的迭代器对象:

#include<iostream>
#include<vector>
#include<iterator>
#include<typeinfo>


using namespace std;
int main(){
    vector<int> vec={1,2,3,4,5,6,7,8,9,10};
    int element=4;
    auto pltr=begin(vec);
        
    void begin2value(vector<int>::iterator pltr,const int element);//外部函数声明
    begin2value(pltr,element);//调用外部函数

    //检查输出为1,是*(begin(vec))的值
    cout<<(*pltr)<<endl;
    

}
void begin2value(vector<int>::iterator pltr,const int element)//迭代器的值等于需要查找的值,则结束while
{
    while((*pltr)!=element)
        pltr++;
}

明白这点之后,我们还需要注意在传递vector容器时,外部函数内部操作的也是该对象的拷贝。

如果我们要实现一个在外部实现迭代器二分查找的操作而直接向函数传递原来的容器,编译器很可能因为访问越界的内存空间而提示"Segmentation fault",即访问段错误,例如:

我们通过使用==运算符来判断两个迭代器是否来自于同一个容器,编译器返回了0,代表在biSearch内部用来创建迭代器的vec只是主函数中vec的一个拷贝,而非引用。通过迭代器距离函数distance来监测两个迭代器之间的距离,距离的输出值为9321038,这部分的内存很可能为操作系统保留或其它进程使用,VSCode直接报异常,以防止程序随意修改该内存中的数据。

       如果我们传入vec的引用,则直接无法通过编译,因为我们不能对vec引用调用相应的容器成员函数begin(),end(),从而无法创建lower、higher。

要使程序通过编译并达到我们想完成的目标,只需要将lower和higher定义在主函数中并作为参数传递,并在函数中将创建的迭代器拷贝返回给真实的迭代器就可以了:

可以看到在主函数内部调用biSearch后将迭代器pltr由原来的begin(vec)移动到了element为4的位置,我们通过使用<typeinfo>头文件下的函数typeid来监测使用传入容器vec构造的迭代器和在主函数创建的迭代器类型是否一致,编译器返回了1,并且传递给主函数调用的迭代器也指向了我们希望保留的位置。

      

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++迭代器作为参数传递进函数使用时的注意事项 的相关文章

  • 以相反的顺序迭代可变参数模板参数

    如果我手动反转传递给它的模板参数的顺序 以下代码将起作用 template
  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • C# 中附加/分离事件处理程序的不同方式有什么区别

    我的问题有两个部分 首先 我们可以通过以下两种方式附加事件处理程序 myObject MyEvent new EventHandler MyHandler myObject MyEvent MyHandler 据我了解 这两者是等价的 在第
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 在“using”语句中使用各种类型 (C#)

    自从C usingstatements只是try finally dispose 的语法糖 为什么它接受多个对象仅当它们属于同一类型时 我不明白 因为它们需要的只是 IDisposable 如果它们都实现 IDisposable 应该没问题
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • asp.net c# 防止在从服务器端代码更改索引时触发 selectedindexchanged 事件

    我在同一个 aspx 页面上有两个下拉列表控件
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use

随机推荐

  • Python中的map()函数

    前言 今天做题时遇到了map 函数 来学习一下 如果感觉博主的文章还不错的话 还请关注 点赞 收藏三连支持一下博主哦 目录 map函数 描述 语法 返回值 实例 map函数 描述 map在这里不是地图的意思 在编程领域 map一般作 映射
  • 富文本组件VueQuill添加源代码编辑功能

    文章目录 前言 一 VueQuill地址 二 Module quill html edit button 的位置 二 使用步骤 1 安装依赖 2 修改富文本组件 src components Editor index vue 3 验证 总结
  • Linux生成dumpcore并进行调试,以及addr2line的用法

    1 在终端中输入ulimit c 如果结果为0 说明当程序崩溃时 系统并不能生成core dump 2 使用ulimit c unlimited命令 开启core dump功能 并且不限制生成core dump文件的大小 如果需要限制 加数
  • Android 重写系统Crash处理类,保存Crash信息到SD卡 和 完美退出程序的方法

    转载时注明地址 http blog csdn net xiaanming article details 9344703 我们开发Android应用的时候 当出现Crash的时候 系统弹出一个警告框 如下图一 有些手机会黑屏几秒钟然后还伴随
  • C语言:分支语句和循环语句(超详解)

    目录 编辑 什么是语句 分支语句 选择结构 if语句 应该注意的是 switch语句 运用练习 循环语句 while循环 for循环 break和continue在for循环中 for循环的变换使用 do while 循环 do while
  • Eclipse的switch workspace删除多余workspace

    很多朋友很懊恼 如何删除eclipse里的switch workspace不要的workspace 这里来介绍一个简单的操作方法 方法 步骤 第一步 删除项目文件夹 找到目录下的项目文件夹 右键删除或者 Delete 按钮 第二步 修改or
  • 查看数据库某个schema下哪张表占的空间大

    为了查询schema下某个表占用的空间问题 以便处理分析问题 直接复制粘贴 改schema 即可 select TABLE NAME concat truncate data length 1024 1024 2 MB as data si
  • Cpu运作原理与机制,那么CPU如何跑的更快?

    前言 代码都是由 CPU 跑起来的 我们代码写的好与坏就决定了 CPU 的执行效率 特别是在编写计算密集型的程序 更要注重 CPU 的执行效率 否则将会大大影响系统性能 CPU 内部嵌入了 CPU Cache 高速缓存 它的存储容量很小 但
  • 数学建模中的常见模型

    数学建模中比较常见的几种模型 一 预测与预报 1 灰色预测模型 必须掌握 满足两个条件可用 数据样本点个数少 6 15个 数据呈现指数或曲线的形式 例如 可以通过极值点和稳定点来预测下一次稳定点和极值点出现的时间点 2 微分方程预测 高大上
  • 怎样改变input被选中时边框颜色

    1 当input获得焦点时 input focus outline 1px solid 000 2 输入合法时 input valid border 1px solid green 3 输入不合法时 input invalid border
  • ElasticSearch 入门教程笔记

    视频教程 狂神说Java ElasticSearch7 6 x最新完整教程通俗易懂 视频地址 https www bilibili com video BV17a4y1x7zq 拒绝白嫖 感谢狂神分享的视频教程 ElasticSearch
  • Echarts 给pie圆饼图series.data 赋值

    1 如何去掉字符串最外层的双引号 使其变成数组 var data id 32 wd 20 3 jd 113 3 id 321 wd 20 3 jd 113 3 var yy var mm yy data split for var i 0
  • 数据挖掘算法与现实生活中的应用案例

    如何分辨出垃圾邮件 如何判断一笔交易是否属于欺诈 如何判断红酒的品质和档次 扫描王是如何做到文字识别的 如何判断佚名的著作是否出自某位名家之手 如何判断一个细胞是否属于肿瘤细胞 等等 这些问题似乎都很专业 都不太好回答 但是 如果了解一点点
  • 归因分析计算因子贡献度常见的方法

    在归因分析中 我们一般都需要计算出每个因子的贡献度是多少 比如产品DAU上升 对年龄段维度进行拆解 看是不同年龄段的用户对DAU上升的贡献度是多少 一般根据指标的类型 计算贡献度的方法也不一样 下面就列出一些常见的归因分析贡献度的计算方法
  • mt4服务器显示无连接,MT4登录显示“无效账户”,“无法连接”怎么解决

    MT4账户分为实盘账户和模拟账户 小编每天都会收到很多客户实盘账号登入不上去的申请 有的客户反应账户显示登录无效 或者无连接 没有数据流 客户就会问 是不是我的账号过期不能使用 其实不是的 账户登入不上有如下几个原因 首先我先要告诉大家 一
  • ISP(图像信号处理)算法概述、工作原理、架构、处理流程

    转自 https zhuanlan zhihu com p 115321553 ISP的主要内部构成 ISP内部包含 CPU SUP IP 各种功能模块的通称 IF 等设备 ISP的控制结构 1 ISP逻辑 2 运行在其上的firmware
  • ARM 浮点运算详解

    一 早期ARM上的浮点模拟器 早期的ARM没有协处理器 所以浮点运算是由CPU来模拟的 即所需浮点运算均在浮点运算模拟器 float math emulation 上进行 需要的浮点运算 常要耗费数千个循环才能执行完毕 因此特别缓慢 直到今
  • Vue路由中,history和hash两种模式有什么区别?

    前端路由有两种模式 hash 模式和 history 模式 接下来分析这两种模式的实现方式和优缺点 hash 模式 hash 模式是一种把前端路由的路径用井号 拼接在真实 URL 后面的模式 当井号 后面的路径发生变化时 浏览器并不会重新发
  • MySQL 表连接 JOIN

    参考 表连接 前言 建表语句 测试数据 一 表连接JOIN基础 1 什么是表连接 什么是JOIN 2 表连接的分类 2 1 内连接 2 2 外连接 2 3 等值连接 2 4 自然连接 前言 建表语句 表a CREATE TABLE a ta
  • C++迭代器作为参数传递进函数使用时的注意事项

    外部函数对迭代器进行值传递而非引用 需要注意的一点是在使用迭代器作为传入参数进行迭代器运算操作的时候 作用对象仅仅是对传入迭代器的拷贝 因为在传入迭代器后函数直接对传入的对象进行拷贝操作而不访问源对象的内存空间https blog csdn