首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

老梁聊C++,为什么不能修改set里的值?如果非要修改怎么办?

作者 | 梁唐 大家好,我是梁唐。 在上一期文章当中讲解了set的一些常规用法和api,最后末尾的时候留了一个问题,如何修改set中的元素?今天就来聊聊这个问题。...不知道有没有小伙伴去尝试,可能有些小伙伴尝试了之后会说不对啊,在我电脑上怎么能运行?...后者表示迭代器本身是一个常量,即迭代器本身指向的位置不能修改。而前者表示迭代器指向的位置是一个const常量,迭代器本身可以修改,指向不同的位置,但我们不能修改它指向的位置的值。...这里有必要说明一下,在C++当中const修饰符出现的位置不同有不同的含义。以指针举例,const T* p和T* const p是两种完全不同的指针,前者表示不能通过指针去修改指向对象的内容。...这也是为什么C++ Primer里强烈建议大家不要修改set中元素值的原因,如果真的要修改,只能先删除再添加了。虽然这样会牺牲一点点性能,但至少可以保证set里的数据都是安全有序的。

1.4K20

为什么Iterator的remove方法可保证从源集合中安全地删除对象,而在迭代期间不能直接删除集合内元素

这是为什么呢?...有些集合不允许在迭代时删除或添加元素,但是调用 Iterator 的remove() 方法是个安全的做法。 那么为什么用Iterator删除时是安全的的呢?...现在我们回到最初的问题,为什么用list直接删除元素迭代器会报错?...通过源码可以看出,在获取迭代器时,迭代器内的expectedModCount被初始化为modCount,此时如果直接用ArrayList对象直接remove,那么就会改变modCount的值(进行了加一...Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast

5.9K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java如何实现封装_java如何实现封装

    大家好,又见面了,我是你们的朋友全栈君。 Java中类的封装是如何实现的封装是将对象的信息隐藏在对象内部,禁止外部程序直接访问对象内部的属性和方法。...初学的话,这个你只能从概念上理解,这我就不多废话了,百度一下一大堆。 这个封装其实就是面向对象语言的精髓,在这里一些都是对象,我们通过封装,只为用户提供接口。 Java中类的封装是如何实现的?...java中什么是类的封装性 类的封装性即不能让外面的类随意修改一个类的成员变量; 在定义一个类的成员,使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用...因为面向对象中所有的实体都是以对象为基本单位的,以宏观世界的实体来映射到计算机世界中,每个对象有它自己的属性和自己的行为。 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。...在Java面向对象的编程当中的为什么要封装?

    1.5K10

    彻底弄懂JS原型与原型链

    图片可以看到obj上确实多了一个sayHello的属性,值为一个函数,但是问题来了,obj上面并没有hasOwnProperty这个方法,为什么我们可以调用呢?这就引出了 原型。...当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去对象的原型(原型也是对象,也有它自己的原型)的原型上找,如此继续,直到找到为止,或者查找到最顶层的原型对象中也没有找到...OK,总结一下:原型存在的意义就是组成原型链:引用类型皆对象,每个对象都有原型,原型也是对象,也有它自己的原型,一层一层,组成原型链。...原型链存在的意义就是继承:访问对象属性时,在对象本身找不到,就在原型链上一层一层找。说白了就是一个对象可以访问其他对象的属性。...__proto__ // true上面说过,构造函数是为了创建特定类型的对象,那如果我想让Person这个构造函数创建的对象都共享一个方法,总不能像下面这样吧:错误示范// 调用构造函数Person创建一个新对象

    1.2K40

    为什么我写不出面向对象的代码

    ” 那么上面的案例代码也有抽象,也有封装,为什么还是算面向过程思维呢。 那么什么是面向对象呢?...这里我理解的是: “ 万物皆可为对象 对象包含了自身属性与行为 功能的交付其实是对象与对象之间的交互 ” 那么按照这样的想法,上述代码中的校验,三方系统推送,消息通知应该属于各自对象的行为。...关于DDD领域驱动设计,推荐书籍: “《领域驱动设计:软件核心复杂性应对之道》 《实现领域驱动设计》 ” 为什么我们在使用贫血模型 看了上面的代码,我们可能会疑问:我使用贫血模型开发挺好的啊?...因此我总结为什么人们更愿意使用贫血模型呢: “ 充血模型相对贫血模型存在一定的设计难度,你需要多花时间思考哪些是对象本身的行为 面向过程的编程思想根深蒂固,很难改变 对代码没有太大负责态度,认为怎么简单怎么来...那么建议你多做一些的思考: 1.我的代码是不是面向对象的代码 2.我的代码设计是否遵循 高内聚,低耦合的设计标准 3.我的代码是否遵循设计原则,如单一职责原则,开闭原则等 4. ...

    1.2K20

    我用编程模拟疫情的传播来告诉你: 为什么现在的你还不能出门

    看完视频你就明白为什么不能出门了,千万不要放松警惕!(@Ele实验室 ) 在家憋了一段时间的人们,耐心也在一点一点消磨中。很多人已经忍不住开始想蠢蠢欲动了。...他们总有一套自己的理论:我们城市才一点确诊病人,而且在距离我们很远的地方,我就出去一会儿,哪有那么巧合,就感染上了。没事儿的!大街上都没人,我戴着口罩又没事。...疫情的防控工作的防控点或者是成功与否主要在于感染人员是否戴口罩、医院里的隔离床位(或者是自我隔离位)、人口的流动。...因此通过这一次的疫情防控,为了你、我、他,请以后感冒发烧生病之后,能够带个口罩,减少传染率。因为不知道你体内的这一个病毒威力如何。 ?...因此一个疫情发生,必须依靠强大有力的政府比如中国,和广大的医院医生护士等伟大的工作者们的努力,所以平时请尽量的尊重他们的这个职业。 ?

    2.1K10

    彻底搞懂JS原型与原型链

    图片可以看到obj上确实多了一个sayHello的属性,值为一个函数,但是问题来了,obj上面并没有hasOwnProperty这个方法,为什么我们可以调用呢?这就引出了 原型。...当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去对象的原型(原型也是对象,也有它自己的原型)的原型上找,如此继续,直到找到为止,或者查找到最顶层的原型对象中也没有找到...OK,总结一下:原型存在的意义就是组成原型链:引用类型皆对象,每个对象都有原型,原型也是对象,也有它自己的原型,一层一层,组成原型链。...原型链存在的意义就是继承:访问对象属性时,在对象本身找不到,就在原型链上一层一层找。说白了就是一个对象可以访问其他对象的属性。...__proto__ // true上面说过,构造函数是为了创建特定类型的对象,那如果我想让Person这个构造函数创建的对象都共享一个方法,总不能像下面这样吧:错误示范// 调用构造函数Person创建一个新对象

    2.6K40

    【八股文Java】: Java对象的hashCode()值是可变的吗?发生GC之后会变吗?为什么?hashCode值如何生成?

    问:Java对象的hashCode()值是可变的吗?发生GC之后会变吗?为什么?hashCode值如何生成? 答:Java对象的hashCode()默认实现是不可变的,即使GC之后也不会变。...因为: 1、如果Java对象的hashCode()方法重写即自定义hashCode值的实现,参与hash计算的变量一旦被赋值后就不能再改变,hash值与map容器相关,一旦改变,map取值:可能发生业务异常...2、默认Java对象的hashCode()方式的实现是native级别的,即JVM层实现,生成hashCode值后会保存到对象的对象头MarkWord中,即缓存在对象头MarkWord中,不会重复计算。...---- 附: 默认Java对象的hashCode()方式的实现跟踪源码(openjdk源码 版本jdk-jdk-21-ga): 1、寻找注册的hashCode的native方法: (src/hotspot...: 上述找到的ObjectSynchronizer::FastHashCode方法实现部分代码: HashCode的生成方法: 可以看到HashCode的生成有好几种策略,此openjdk默认的策略时最后一种

    89630

    一篇文章带你了解JavaScript中的变量,作用域和内存问题

    file 函数changeDa()的作用域链包含两个对象: 它自己的变量对象,和,全局环境的 变量对象。...过程: daDa()函数的局部环境,会先开始搜索自己的变量对象中的变量和函数名,如果找不到,会向上搜索上一级的作用域链。...对于changDa()中的环境: 它包含两个对象::一为它自己的变量对象,二为全局变量对象。 即它不能访问daDa()函数的局部环境。...但是在调用这个函数时会返回为0,这是为什么呢?...file 延长作用域的表现 ? file 什么是作用域链? 我的理解就是,根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。

    50610

    map中的值对象虽然不能修改,但是可以替换

    值对象与指针对象 假设有一个 map 对象 map[string]Person , 其中 Person 定义如下。...是一个 struct type Person struct { Age int } 现在有一个需求, map 中的 Person 对象年龄为 0 , 则将其默认值设置为 18。...很显然, 由于 map[string]Person 中保存的是 值对象 ,因此通过任意方式获取的都是 值对象的副本 , 所有修改都是在副本上, 不能 修改真实值。...*Person 是 指针对象 , 获取到的是 指针对象的副本, 而 指针副本 也指向了原始数据, 就 可以修改 真实值。...虽然不能被修改, 但是能被覆盖 然而, map 本身可以被 被认为 是一个指针对象。因此可以通过 同名 key 赋值覆盖的方式, 实现 修改的效果。

    3.1K20

    IO流为什么必须手动关闭,不能像其他的对象坐等GC回收?

    // 删除文件之前,先将 IO 流关闭 reader.close(); // 删除文件 file.delete(); 可能有的同学会发出疑问,为什么 IO 流必须手动关闭,不能像其他的方法一样坐等...可能有的同学又发出疑问,我平时本地测试的时候没有发现这个问题,为什么部署到线上就出这个提示的呢?...IO 流对象赋予给了out参数。...五、小结 本位主要围绕【为什么 IO 流必须手动关闭,不能像其他的方法坐等 GC 处理】这个话题进行一次内容的整合和总结,同时也给出了推荐的正确关闭 IO 流的写法。...六、参考 1、csdn - 演员12138 - IO流为什么必须手动关闭,不能像其他的方法坐等GC处理 2、csdn - 思想永无止境 - Java之关闭流

    1.1K30

    如何使用闭包进行一次降维打击?

    可以看到,直接运行outer()以后,返回的是一个函数对象,我们需要再次运行这个函数对象,才能运行最里面的函数的代码。...由于 Python 有作用域的规定,所以在闭包里面是默认只能读取,但不能修改外层函数的变量。我们来测试一下: ? 当你在闭包里面只有读,没有写的时候,闭包可以正确读取外层的变量值。...但是当你尝试给外层变量赋值的时候,如果你在赋值语句上方尝试读取这个变量,就会报错。就像是没有定义变量一样。 并且,即使在赋值语句上方没有读取变量值的操作,你的赋值语句也不能修改外层函数的变量。...在闭包中是另外创建一个同名的变量而已,对它的修改不能影响外层变量。 为了在闭包中修改外层变量,我们需要使用一个关键词:nonlocal,它可以获取上一层的作用域。 我们来看一下: ?...大家注意,每一次我获取值的时候,都是直接运行fib(),不需要传入具体的值。也就是说,这个函数fib它自己知道自己当前运行到第几个值了。

    59330

    Prototypal inheritance原型继承(实用篇)

    当我们想从对象中读取一个property,但是该对象没有该property时,JavaScript会自动从该对象的prototype中读取该property。...事实上,Prototype有2个限制: 引用不能形成环状。如果我们尝试给proto赋值,来形成环状结构,JavaScript会抛出错误。 proto的值要么是一个对象要么是null。没有其它的值。...虽然很明显,但是还是要说一下:一个对象只有一个prototype。一个对象不能同时从2个以上的其它对象继承。...我们有2个仓鼠:speedy和lazy,它们都继承自通用的仓鼠对象。 当我们喂它们中的一个时,另外一个也会饱。为什么?怎样修改代码才能修正这个问题?...值会被直接写入到this. 我们也可以通过给每个仓鼠新建一个它自己的stomach,来避免问题的出现。

    66730

    深度神经网络权值初始化的几种方式及为什么不能初始化为零(1)

    写在前面:该篇文章的内容以及相关代码(代码在最后),都是我亲自手敲出来的,相关结论分析也是花了挺长时间做出来的,如需转载该文章,请务必先联系我,在后台留言即可。...一个好的权值初始值有以下优点: · 梯度下降的收敛速度较快 · 深度神经中的网络模型不易陷入梯度消失或梯度爆炸问题 该系列共两篇文章,我们主要讨论以下两个话题: 1、为什么在线性回归和逻辑回归中可以采用...0初始化,而在神经网络中不能采用(实际上不光是0初始化,将权值初始化为任意相同值,都很有可能使模型失效); 2、常用的三种权值初始化方法:随机初始化、Xavier initialization、He initialization...我们看一下使用权值 0 初始化的神经网络训练并测试该数据集的结果: ?...测试结果 在100次的迭代中,每一次迭代,损失值都没有变化 模型检测的准确度为11.35%,几乎完全没有检测出来 总结一下:在神经网络中,如果将权值初始化为 0 ,或者其他统一的常量,会导致后面的激活单元具有相同的值

    2.4K20

    为什么我建议线上高并发量的日志输出的时候不能带有代码位置

    如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~ 本文是“为什么我建议”系列第二篇,本系列中会针对一些在高并发场景下,我对于组内后台开发的一些开发建议以及开发规范的要求进行说明和分析解读...往期回顾: 为什么我建议在复杂但是性能关键的表上所有查询都加上 force index 在业务一开始上线的时候,我们线上日志级别是 INFO,并且在日志内容中输出了代码位置,格式例如: 2022-03...Java 9 之后,添加了新的 StackWalker 接口,结合 Stream 接口来更优雅的读取堆栈,即: 我们先来看看 new Exception().getStackTrace(); 底层是如何获取堆栈的...模拟两种方式获取调用打印日志方法的代码位置,与不获取代码位置会有多大性能差异 以下代码我参考的 Log4j2 官方代码的单元测试,首先是模拟某一调用深度的堆栈代码: 然后,编写测试代码,对比纯执行这个代码...由此,我建议:对于微服务环境,尤其是响应式微服务环境,堆栈深度非常深,如果会输出大量的日志的话,这个日志是不能带有代码位置的,否则会造成严重的性能衰减。

    1.4K20

    详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了....

    三 但是,看了输出,我就纳闷为什么,为什么第三行不是BigEgg2.Yolk(),不能覆盖吗?...那么,他们构造方法为什么不能覆盖,都是Public Yolk(){}。 当然,网上都说子类继承父类除构造方法以外的所有方法,但这是结果,我要知道为什么!! 五 先说几个错误的观点 1....有说构造方法的方法名与类名必须一样,父子类不能同名,故不能继,所以不能覆盖构造方法。 这个不用多说,这个例子,就是大神写出来打这样说的人的脸的。 2....(这就是为什么创建子类时先创建完父类的原因了) 那么很明显了,要是同名类之间可以覆盖了,子类创建时就是创建了两个自己而没有父类。...Java设计的时候,他们绝对想到有些人会像强迫症那样折腾个同名类继承,然后实现构造覆盖的场景吧.... 总结 构造方法是唯一的,不能又造爸爸又造儿子

    2.1K20

    面试官:告诉我为什么static和transient关键字修饰的变量不能被序列化?

    一、写在开头在上一篇学习序列化的文章中我们提出了这样的一个问题:“如果在我的对象中,有些变量并不想被序列化应该怎么办呢?”...当时没有解释具体为什么static和transient 关键字修饰的变量就不能被序列化了,这个问题实际上在很多大厂的面试中都可能会被问及。我们今天在这篇中进行解释吧。...来说,在整个序列化过程中,它并未参与,原因是:我们在序列化与反序列化之间插入了属性的重新赋值操作,最后输出中打印出的是最新赋值,说明仅是调用了实例对象的属性值,而不是反序列化的结果。...而这段源码就证明了,为什么在对象序列化过程中,static和transient不会被序列化!...四、总结好啦,今天针对为什么static和transient关键字修饰的变量不能被序列化进行了一个解释,下次大家在面试的时候再被问道就可以这样回答啦,不过,还有的BT面试官会问transient关键字修饰的变量真的不能被序列化吗

    22220

    理解JS 原型链

    如果还不明白,我在打个比喻: 就像A街上有一间麦当劳,在B街上也开了一间麦当劳,它们都叫麦当劳,作用也是一样的。但是你总不能说他们是一间麦当劳吧?...person1.sayName === person2.sayName;//false 如果这样的话,我们每构造出来一个对象,都要单独为这个对象创建出一个专属于它自己使用的sayName,这是很占用内存的...那我们能不能让所有的实例对象都共同使用一个sayName方法,来节省内存,提升效率呢?这需要我们先理解原型对象的概念。 #原型对象 我们先了解原型对象的概念。...有的,该属性的值为1 console.log(o.b); // 2 // o上有b这个属性吗?...因为它继承了Object.prototyoe上的toString的方法。 null 既然对象都会继承自Object.prototype上面的方法,那它自己的原型又是什么呢。

    1.7K10

    我为什么要创建一个不能被实例化的类

    但如果有一天,你发现我写了这样一个类: class People: def say(self): print(f'我叫做:{self.name}') def __new...__(self): raise Exception('不能实例化这个类') kingname = People() kingname.say() 一旦初始化就会报错,如下图所示:...一个不能被初始化的类,有什么用? 这就要引入我们今天讨论的一种设计模式——混入(Mixins)。 Python 由于多继承的原因,可能会出现钻石继承[1]又叫菱形继承。...显然,这样写会报错,因为两个类的实例是不能比较大小的: 但在现实生活中,当我们说 某人比另一个人大时,实际上是指的某人的年龄比另一人年龄大。...混入: 不能包含状态(实例变量)。 包含一个或多个非抽象方法。 参考资料 [1]钻石继承: https://en.wikipedia.org/wiki/Multiple_inheritance

    3.4K10
    领券